chat/apps/chat/services/conversation.py

65 lines
2.2 KiB
Python

from uuid import UUID
from django.db import transaction
from apps.chat.integrations.mattermost.client import MattermostClient
from apps.chat.models import (
Conversation,
ConversationParticipant,
MattermostAccountMapping,
)
from apps.chat.services.account import AccountService
class ConversationService:
def __init__(
self,
account_service: AccountService | None = None,
mattermost_client: MattermostClient | None = None,
):
self._account = account_service or AccountService()
self._mm = mattermost_client or MattermostClient()
def create(self, user_1_id: UUID, user_2_id: UUID) -> Conversation:
if not self._account.validate_user(user_1_id):
raise ValueError(f"User {user_1_id} is not valid")
if not self._account.validate_user(user_2_id):
raise ValueError(f"User {user_2_id} is not valid")
mm_user_1 = self._mm.get_or_create_user(user_1_id)
mm_user_2 = self._mm.get_or_create_user(user_2_id)
MattermostAccountMapping.objects.get_or_create(
user_id=user_1_id,
defaults={"mattermost_user_id": mm_user_1},
)
MattermostAccountMapping.objects.get_or_create(
user_id=user_2_id,
defaults={"mattermost_user_id": mm_user_2},
)
channel_id = self._mm.create_private_channel([mm_user_1, mm_user_2])
with transaction.atomic():
conversation = Conversation.objects.create(mattermost_channel_id=channel_id)
ConversationParticipant.objects.create(
conversation=conversation, user_id=user_1_id
)
ConversationParticipant.objects.create(
conversation=conversation, user_id=user_2_id
)
return conversation
def list_for_user(
self, user_id: UUID, page: int, page_size: int
) -> list[Conversation]:
offset = page * page_size
conversation_ids = ConversationParticipant.objects.filter(
user_id=user_id
).values_list("conversation_id", flat=True)
return list(
Conversation.objects.filter(id__in=conversation_ids).order_by(
"-created_at"
)[offset : offset + page_size]
)