22import functools
33import json
44import inspect
5- from typing import Callable , Any , Optional , Dict , Union , List
5+ from typing import Callable , Any , Optional , Dict , Union
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 , SystemLogsResource
12+ from common .audit .models .log_model import OperationType , OperationStatus , SystemLog
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- def get_resource_name_by_id_and_module (session , resource_id : Any , module : str ) -> List [Dict [str , str ]]:
21+
22+ def get_resource_name_by_id_and_module (session , resource_id : Any , module : str ) -> Optional [str ]:
2223 resource_union_query = build_resource_union_query ()
2324 resource_alias = resource_union_query .alias ("resource" )
2425
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
41- )
42- )
26+ if isinstance (resource_id , list ):
27+ # 处理列表情况
28+ if not resource_id :
29+ return None
4330
44- results = session .execute (query ).fetchall ()
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+ )
39+ )
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 ()
4556
46- return [{
47- 'resource_id' : str (row .id ),
48- 'resource_name' : row .name or '' ,
49- 'module' : row .module or ''
50- } for row in results ]
5157
5258class LogConfig (BaseModel ):
5359 operation_type : OperationType
@@ -384,7 +390,6 @@ async def create_log_record(
384390 remark : Optional [str ] = None ,
385391 oid : int = - 1 ,
386392 opt_type_ref : OperationType = None ,
387- resource_info_list : Optional [List ] = None ,
388393 ) -> Optional [SystemLog ]:
389394 """Create log records"""
390395 try :
@@ -417,46 +422,21 @@ async def create_log_record(
417422 error_message = error_message ,
418423 module = config .module ,
419424 resource_id = str (resource_id ),
425+ resource_name = str (resource_name ),
420426 request_method = request .method if request else None ,
421427 request_path = request .url .path if request else None ,
422428 request_params = request_params ,
423429 create_time = datetime .now (),
424430 remark = remark
425431 )
426432
427-
428433 with Session (engine ) as session :
429434 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' )
430438 session .commit ()
431439 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 ()
460440 return log
461441
462442 except Exception as e :
@@ -492,7 +472,6 @@ async def async_wrapper(*args, **kwargs):
492472 remark = None
493473 oid = - 1
494474 opt_type_ref = None
495- resource_info_list = None
496475
497476 try :
498477 # Get current request
@@ -536,7 +515,7 @@ async def async_wrapper(*args, **kwargs):
536515 resource_name = input_account
537516 if config .operation_type == OperationType .DELETE :
538517 with Session (engine ) as session :
539- resource_info_list = get_resource_name_by_id_and_module (session , resource_id , config .module )
518+ resource_name = get_resource_name_by_id_and_module (session , resource_id , config .module )
540519
541520 if config .operation_type == OperationType .CREATE_OR_UPDATE :
542521 opt_type_ref = OperationType .UPDATE if resource_id is not None else OperationType .CREATE
@@ -551,6 +530,10 @@ async def async_wrapper(*args, **kwargs):
551530 result ,
552531 "result"
553532 )
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 )
536+ return result
554537
555538 except Exception as e :
556539 status = OperationStatus .FAILED
@@ -585,8 +568,7 @@ async def async_wrapper(*args, **kwargs):
585568 remark = remark ,
586569 request = request ,
587570 oid = oid ,
588- opt_type_ref = opt_type_ref ,
589- resource_info_list = resource_info_list
571+ opt_type_ref = opt_type_ref
590572 )
591573 except Exception as log_error :
592574 print (f"[SystemLogger] Log creation failed: { log_error } " )
@@ -599,7 +581,6 @@ def sync_wrapper(*args, **kwargs):
599581 request = None
600582 resource_id = None
601583 resource_name = None
602- resource_info_list = None
603584 result = None
604585
605586 try :
@@ -621,7 +602,7 @@ def sync_wrapper(*args, **kwargs):
621602 # Obtain client information
622603 if config .operation_type == OperationType .DELETE :
623604 with Session (engine ) as session :
624- resource_info_list = get_resource_name_by_id_and_module (session , resource_id , config .module )
605+ resource_name = get_resource_name_by_id_and_module (session , resource_id , config .module )
625606
626607 # Execute the original function
627608 result = func (* args , ** kwargs )
@@ -634,6 +615,10 @@ def sync_wrapper(*args, **kwargs):
634615 "result"
635616 )
636617
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+
637622 return result
638623
639624 except Exception as e :
@@ -667,8 +652,7 @@ def sync_wrapper(*args, **kwargs):
667652 error_message = error_message ,
668653 resource_id = resource_id ,
669654 resource_name = resource_name ,
670- request = request ,
671- resource_info_list = resource_info_list
655+ request = request
672656 )
673657 )
674658 else :
0 commit comments