web_conversation_service.py 2.7 KB

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