12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- import uuid
- from flask_sqlalchemy.pagination import Pagination
- from sqlalchemy import and_, or_
- from extensions.ext_database import db
- from models import App, EndUser, WorkflowAppLog, WorkflowRun
- from models.enums import CreatedByRole
- from models.workflow import WorkflowRunStatus
- class 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),
- ).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
|