| @@ -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 | |||