65 lines
2.2 KiB
Python
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]
|
|
)
|