web_conversation_service.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from typing import Optional, Union
  2. from extensions.ext_database import db
  3. from libs.infinite_scroll_pagination import InfiniteScrollPagination
  4. from models.account import Account
  5. from models.model import App, EndUser
  6. from models.web import PinnedConversation
  7. from services.conversation_service import ConversationService
  8. class WebConversationService:
  9. @classmethod
  10. def pagination_by_last_id(cls, app_model: App, user: Optional[Union[Account, EndUser]],
  11. last_id: Optional[str], limit: int, pinned: Optional[bool] = None,
  12. exclude_debug_conversation: bool = False) -> InfiniteScrollPagination:
  13. include_ids = None
  14. exclude_ids = None
  15. if pinned is not None:
  16. pinned_conversations = db.session.query(PinnedConversation).filter(
  17. PinnedConversation.app_id == app_model.id,
  18. PinnedConversation.created_by_role == ('account' if isinstance(user, Account) else 'end_user'),
  19. PinnedConversation.created_by == user.id
  20. ).order_by(PinnedConversation.created_at.desc()).all()
  21. pinned_conversation_ids = [pc.conversation_id for pc in pinned_conversations]
  22. if pinned:
  23. include_ids = pinned_conversation_ids
  24. else:
  25. exclude_ids = pinned_conversation_ids
  26. return ConversationService.pagination_by_last_id(
  27. app_model=app_model,
  28. user=user,
  29. last_id=last_id,
  30. limit=limit,
  31. include_ids=include_ids,
  32. exclude_ids=exclude_ids,
  33. exclude_debug_conversation=exclude_debug_conversation
  34. )
  35. @classmethod
  36. def pin(cls, app_model: App, conversation_id: str, user: Optional[Union[Account, EndUser]]):
  37. pinned_conversation = db.session.query(PinnedConversation).filter(
  38. PinnedConversation.app_id == app_model.id,
  39. PinnedConversation.conversation_id == conversation_id,
  40. PinnedConversation.created_by_role == ('account' if isinstance(user, Account) else 'end_user'),
  41. PinnedConversation.created_by == user.id
  42. ).first()
  43. if pinned_conversation:
  44. return
  45. conversation = ConversationService.get_conversation(
  46. app_model=app_model,
  47. conversation_id=conversation_id,
  48. user=user
  49. )
  50. pinned_conversation = PinnedConversation(
  51. app_id=app_model.id,
  52. conversation_id=conversation.id,
  53. created_by_role='account' if isinstance(user, Account) else 'end_user',
  54. created_by=user.id
  55. )
  56. db.session.add(pinned_conversation)
  57. db.session.commit()
  58. @classmethod
  59. def unpin(cls, app_model: App, conversation_id: str, user: Optional[Union[Account, EndUser]]):
  60. pinned_conversation = db.session.query(PinnedConversation).filter(
  61. PinnedConversation.app_id == app_model.id,
  62. PinnedConversation.conversation_id == conversation_id,
  63. PinnedConversation.created_by_role == ('account' if isinstance(user, Account) else 'end_user'),
  64. PinnedConversation.created_by == user.id
  65. ).first()
  66. if not pinned_conversation:
  67. return
  68. db.session.delete(pinned_conversation)
  69. db.session.commit()