| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 | import uuidfrom flask_sqlalchemy.pagination import Paginationfrom sqlalchemy import and_, or_from extensions.ext_database import dbfrom models import CreatedByRolefrom models.model import App, EndUserfrom models.workflow import WorkflowAppLog, WorkflowRun, WorkflowRunStatusclass WorkflowAppService:    def get_paginate_workflow_app_logs(self, app_model: App, args: dict) -> Pagination:        """        Get paginate workflow app logs        :param app: app model        :param args: request args        :return:        """        query = (            db.select(WorkflowAppLog)            .where(                WorkflowAppLog.tenant_id == app_model.tenant_id,                WorkflowAppLog.app_id == app_model.id            )        )        status = WorkflowRunStatus.value_of(args.get('status')) if args.get('status') else None        keyword = args['keyword']        if keyword or status:            query = query.join(                WorkflowRun, WorkflowRun.id == WorkflowAppLog.workflow_run_id            )        if keyword:            keyword_like_val = f"%{args['keyword'][:30]}%"            keyword_conditions = [                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_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)            ).filter(or_(*keyword_conditions))        if status:            # join with workflow_run and filter by status            query = query.filter(                WorkflowRun.status == status.value            )        query = query.order_by(WorkflowAppLog.created_at.desc())        pagination = db.paginate(            query,            page=args['page'],            per_page=args['limit'],            error_out=False        )        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
 |