web_conversation_service.py 3.1 KB

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