workflow_app_service.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from flask_sqlalchemy.pagination import Pagination
  2. from sqlalchemy import and_, or_
  3. from extensions.ext_database import db
  4. from models import CreatedByRole
  5. from models.model import App, EndUser
  6. from models.workflow import WorkflowAppLog, WorkflowRun, WorkflowRunStatus
  7. class WorkflowAppService:
  8. def get_paginate_workflow_app_logs(self, app_model: App, args: dict) -> Pagination:
  9. """
  10. Get paginate workflow app logs
  11. :param app: app model
  12. :param args: request args
  13. :return:
  14. """
  15. query = (
  16. db.select(WorkflowAppLog)
  17. .where(
  18. WorkflowAppLog.tenant_id == app_model.tenant_id,
  19. WorkflowAppLog.app_id == app_model.id
  20. )
  21. )
  22. status = WorkflowRunStatus.value_of(args.get('status')) if args.get('status') else None
  23. if args['keyword'] or status:
  24. query = query.join(
  25. WorkflowRun, WorkflowRun.id == WorkflowAppLog.workflow_run_id
  26. )
  27. if args['keyword']:
  28. keyword_val = f"%{args['keyword'][:30]}%"
  29. keyword_conditions = [
  30. WorkflowRun.inputs.ilike(keyword_val),
  31. WorkflowRun.outputs.ilike(keyword_val),
  32. # filter keyword by end user session id if created by end user role
  33. and_(WorkflowRun.created_by_role == 'end_user', EndUser.session_id.ilike(keyword_val))
  34. ]
  35. query = query.outerjoin(
  36. EndUser,
  37. and_(WorkflowRun.created_by == EndUser.id, WorkflowRun.created_by_role == CreatedByRole.END_USER.value)
  38. ).filter(or_(*keyword_conditions))
  39. if status:
  40. # join with workflow_run and filter by status
  41. query = query.filter(
  42. WorkflowRun.status == status.value
  43. )
  44. query = query.order_by(WorkflowAppLog.created_at.desc())
  45. pagination = db.paginate(
  46. query,
  47. page=args['page'],
  48. per_page=args['limit'],
  49. error_out=False
  50. )
  51. return pagination