22import functools
33import json
44import inspect
5- from typing import Callable , Any , Optional , Dict , Union
5+ from typing import Callable , Any , Optional , Dict , Union , List
66from fastapi import Request , HTTPException
77from datetime import datetime
88from pydantic import BaseModel
99from sqlmodel import Session , select
1010import traceback
1111from sqlbot_xpack .audit .curd .audit import build_resource_union_query
12- from common .audit .models .log_model import OperationType , OperationStatus , SystemLog
12+ from common .audit .models .log_model import OperationType , OperationStatus , SystemLog , SystemLogsResource
1313from common .audit .schemas .request_context import RequestContext
1414from apps .system .crud .user import get_user_by_account
1515from apps .system .schemas .system_schema import UserInfoDTO , BaseUserDTO
1818from common .core .db import engine
1919
2020
21-
22- def get_resource_name_by_id_and_module (session , resource_id : Any , module : str ) -> Optional [str ]:
21+ def get_resource_name_by_id_and_module (session , resource_id : Any , module : str ) -> List [Dict [str , str ]]:
2322 resource_union_query = build_resource_union_query ()
2423 resource_alias = resource_union_query .alias ("resource" )
2524
26- if isinstance (resource_id , list ):
27- # 处理列表情况
28- if not resource_id :
29- return None
30-
31- # 构建查询,使用 IN 条件
32- query = select (
33- resource_alias .c .name
34- ).where (
35- and_ (
36- resource_alias .c .id .in_ ([str (id_ ) for id_ in resource_id ]),
37- resource_alias .c .module == module
38- )
25+ # 统一处理为列表
26+ if not isinstance (resource_id , list ):
27+ resource_id = [resource_id ]
28+
29+ if not resource_id :
30+ return []
31+
32+ # 构建查询,使用 IN 条件
33+ query = select (
34+ resource_alias .c .id ,
35+ resource_alias .c .name ,
36+ resource_alias .c .module
37+ ).where (
38+ and_ (
39+ resource_alias .c .id .in_ ([str (id_ ) for id_ in resource_id ]),
40+ resource_alias .c .module == module
3941 )
40- # 执行查询并获取所有结果
41- results = session .execute (query ).scalars ().all ()
42-
43- # 用逗号连接所有名称
44- return "," .join (results ) if results else None
45- else :
46- # 处理单个字符串情况
47- query = select (
48- resource_alias .c .name
49- ).where (
50- and_ (
51- resource_alias .c .id == str (resource_id ),
52- resource_alias .c .module == module
53- )
54- )
55- return session .execute (query ).scalar ()
42+ )
5643
44+ results = session .execute (query ).fetchall ()
45+
46+ return [{
47+ 'resource_id' : str (row .id ),
48+ 'resource_name' : row .name or '' ,
49+ 'module' : row .module or ''
50+ } for row in results ]
5751
5852class LogConfig (BaseModel ):
5953 operation_type : OperationType
@@ -390,6 +384,7 @@ async def create_log_record(
390384 remark : Optional [str ] = None ,
391385 oid : int = - 1 ,
392386 opt_type_ref : OperationType = None ,
387+ resource_info_list : Optional [List ] = None ,
393388 ) -> Optional [SystemLog ]:
394389 """Create log records"""
395390 try :
@@ -422,21 +417,46 @@ async def create_log_record(
422417 error_message = error_message ,
423418 module = config .module ,
424419 resource_id = str (resource_id ),
425- resource_name = str (resource_name ),
426420 request_method = request .method if request else None ,
427421 request_path = request .url .path if request else None ,
428422 request_params = request_params ,
429423 create_time = datetime .now (),
430424 remark = remark
431425 )
432426
427+
433428 with Session (engine ) as session :
434429 session .add (log )
435- session .query (SystemLog ).filter (SystemLog .resource_id == str (resource_id )).update ({
436- SystemLog .resource_name : str (resource_name )
437- }, synchronize_session = 'fetch' )
438430 session .commit ()
439431 session .refresh (log )
432+ # 统一处理不同类型的 resource_id_info
433+ if isinstance (resource_id , list ):
434+ resource_ids = [str (rid ) for rid in resource_id ]
435+ else :
436+ resource_ids = [str (resource_id )]
437+ # 批量添加 SystemLogsResource
438+ resource_entries = []
439+ for resource_id_details in resource_ids :
440+ resource_entry = SystemLogsResource (
441+ resource_id = resource_id_details ,
442+ log_id = log .id ,
443+ module = config .module
444+ )
445+ resource_entries .append (resource_entry )
446+ if resource_entries :
447+ session .bulk_save_objects (resource_entries )
448+ session .commit ()
449+
450+ if config .operation_type == OperationType .DELETE and resource_info_list is not None :
451+ # 批量更新 SystemLogsResource 表的 resource_name
452+ for resource_info in resource_info_list :
453+ session .query (SystemLogsResource ).filter (
454+ SystemLogsResource .resource_id == resource_info ['resource_id' ],
455+ SystemLogsResource .module == resource_info ['module' ],
456+ ).update ({
457+ SystemLogsResource .resource_name : resource_info ['resource_name' ]
458+ }, synchronize_session = 'fetch' )
459+ session .commit ()
440460 return log
441461
442462 except Exception as e :
@@ -472,6 +492,8 @@ async def async_wrapper(*args, **kwargs):
472492 remark = None
473493 oid = - 1
474494 opt_type_ref = None
495+ resource_info_list = None
496+ result = None
475497
476498 try :
477499 # Get current request
@@ -515,7 +537,7 @@ async def async_wrapper(*args, **kwargs):
515537 resource_name = input_account
516538 if config .operation_type == OperationType .DELETE :
517539 with Session (engine ) as session :
518- resource_name = get_resource_name_by_id_and_module (session , resource_id , config .module )
540+ resource_info_list = get_resource_name_by_id_and_module (session , resource_id , config .module )
519541
520542 if config .operation_type == OperationType .CREATE_OR_UPDATE :
521543 opt_type_ref = OperationType .UPDATE if resource_id is not None else OperationType .CREATE
@@ -530,9 +552,6 @@ async def async_wrapper(*args, **kwargs):
530552 result ,
531553 "result"
532554 )
533- if config .operation_type != OperationType .DELETE :
534- with Session (engine ) as session :
535- resource_name = get_resource_name_by_id_and_module (session , resource_id , config .module )
536555 return result
537556
538557 except Exception as e :
@@ -568,7 +587,8 @@ async def async_wrapper(*args, **kwargs):
568587 remark = remark ,
569588 request = request ,
570589 oid = oid ,
571- opt_type_ref = opt_type_ref
590+ opt_type_ref = opt_type_ref ,
591+ resource_info_list = resource_info_list
572592 )
573593 except Exception as log_error :
574594 print (f"[SystemLogger] Log creation failed: { log_error } " )
@@ -581,6 +601,7 @@ def sync_wrapper(*args, **kwargs):
581601 request = None
582602 resource_id = None
583603 resource_name = None
604+ resource_info_list = None
584605 result = None
585606
586607 try :
@@ -602,7 +623,7 @@ def sync_wrapper(*args, **kwargs):
602623 # Obtain client information
603624 if config .operation_type == OperationType .DELETE :
604625 with Session (engine ) as session :
605- resource_name = get_resource_name_by_id_and_module (session , resource_id , config .module )
626+ resource_info_list = get_resource_name_by_id_and_module (session , resource_id , config .module )
606627
607628 # Execute the original function
608629 result = func (* args , ** kwargs )
@@ -615,10 +636,6 @@ def sync_wrapper(*args, **kwargs):
615636 "result"
616637 )
617638
618- if config .operation_type != OperationType .DELETE :
619- with Session (engine ) as session :
620- resource_name = get_resource_name_by_id_and_module (session , resource_id , config .module )
621-
622639 return result
623640
624641 except Exception as e :
@@ -652,7 +669,8 @@ def sync_wrapper(*args, **kwargs):
652669 error_message = error_message ,
653670 resource_id = resource_id ,
654671 resource_name = resource_name ,
655- request = request
672+ request = request ,
673+ resource_info_list = resource_info_list
656674 )
657675 )
658676 else :
0 commit comments