From 5542ee4d0dcd7d69c02497a6cce98306f6975aa7 Mon Sep 17 00:00:00 2001 From: majian <46617237@qq.com> Date: Thu, 8 Aug 2024 14:54:02 +0800 Subject: [PATCH] workflow logs support workflow run id filter (#6833) --- api/services/workflow_app_service.py | 31 ++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/api/services/workflow_app_service.py b/api/services/workflow_app_service.py index 0476788375..c4d3d27631 100644 --- a/api/services/workflow_app_service.py +++ b/api/services/workflow_app_service.py @@ -1,3 +1,5 @@ +import uuid + from flask_sqlalchemy.pagination import Pagination from sqlalchemy import and_, or_ @@ -25,20 +27,26 @@ class WorkflowAppService: ) status = WorkflowRunStatus.value_of(args.get('status')) if args.get('status') else None - if args['keyword'] or status: + keyword = args['keyword'] + if keyword or status: query = query.join( WorkflowRun, WorkflowRun.id == WorkflowAppLog.workflow_run_id ) - if args['keyword']: - keyword_val = f"%{args['keyword'][:30]}%" + if keyword: + keyword_like_val = f"%{args['keyword'][:30]}%" keyword_conditions = [ - WorkflowRun.inputs.ilike(keyword_val), - WorkflowRun.outputs.ilike(keyword_val), + WorkflowRun.inputs.ilike(keyword_like_val), + WorkflowRun.outputs.ilike(keyword_like_val), # filter keyword by end user session id if created by end user role - and_(WorkflowRun.created_by_role == 'end_user', EndUser.session_id.ilike(keyword_val)) + and_(WorkflowRun.created_by_role == 'end_user', EndUser.session_id.ilike(keyword_like_val)) ] + # filter keyword by workflow run id + keyword_uuid = self._safe_parse_uuid(keyword) + if keyword_uuid: + keyword_conditions.append(WorkflowRun.id == keyword_uuid) + query = query.outerjoin( EndUser, and_(WorkflowRun.created_by == EndUser.id, WorkflowRun.created_by_role == CreatedByRole.END_USER.value) @@ -60,3 +68,14 @@ class WorkflowAppService: ) return pagination + + @staticmethod + def _safe_parse_uuid(value: str): + # fast check + if len(value) < 32: + return None + + try: + return uuid.UUID(value) + except ValueError: + return None