| import uuid | |||||
| from flask_sqlalchemy.pagination import Pagination | from flask_sqlalchemy.pagination import Pagination | ||||
| from sqlalchemy import and_, or_ | from sqlalchemy import and_, or_ | ||||
| ) | ) | ||||
| status = WorkflowRunStatus.value_of(args.get('status')) if args.get('status') else None | 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( | query = query.join( | ||||
| WorkflowRun, WorkflowRun.id == WorkflowAppLog.workflow_run_id | 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 = [ | 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 | # 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( | query = query.outerjoin( | ||||
| EndUser, | EndUser, | ||||
| and_(WorkflowRun.created_by == EndUser.id, WorkflowRun.created_by_role == CreatedByRole.END_USER.value) | and_(WorkflowRun.created_by == EndUser.id, WorkflowRun.created_by_role == CreatedByRole.END_USER.value) | ||||
| ) | ) | ||||
| return pagination | 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 |