|
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), |
|
|
|
and_(WorkflowRun.created_by_role == "end_user", EndUser.session_id.ilike(keyword_like_val)), |
|
] |
|
|
|
|
|
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: |
|
|
|
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): |
|
|
|
if len(value) < 32: |
|
return None |
|
|
|
try: |
|
return uuid.UUID(value) |
|
except ValueError: |
|
return None |
|
|