findOrCreateSoloConversation static method

Future<ChatModel> findOrCreateSoloConversation(
  1. String username, {
  2. bool isAnonymouslyOfFirebaseId = false,
  3. bool isAnonymouslyOfMime = false,
})

Implementation

static Future<ChatModel> findOrCreateSoloConversation(
  String username, {
  bool isAnonymouslyOfFirebaseId = false,
  bool isAnonymouslyOfMime = false,
}) async {
  UserStatusHelper.setMyLastSeenAt();
  try {
    chatV2Print(
        'findOrCreateSoloConversation called with username: $username');
    // Tìm cuộc trò chuyện 1-1 hiện có
    final existingChat = await supabase
        .from('chats')
        .select('''
        *,
        chat_members!inner (
          user_id,
          is_admin,
          joined_at,
          latest_seen_at
        ),
        messages!chats_latest_message_id_fkey(*)
      ''')
        .eq('is_group', false)
        .inFilter('chat_members.user_id', [loggedUsername, username]);

    chatV2Print('Existing chats found: ${existingChat.length}');

    // Kiểm tra xem có chat với user được chỉ định không
    final existingChatWithUser = existingChat.firstWhere(
      (chat) =>
          (chat['chat_members'] as List)
              .any((member) => member['user_id'] == username) &&
          (chat['chat_members'] as List)
              .any((member) => member['user_id'] == loggedUsername),
      orElse: () => {},
    );

    chatV2Print(
        'Existing chat with user: ${existingChatWithUser.isNotEmpty ? 'found' : 'not found'}');

    if (existingChatWithUser.isNotEmpty) {
      chatV2Print('Returning existing chat data: ${existingChatWithUser}');
      return ChatModel.fromJson(existingChatWithUser);
    } else {
      chatV2Print('Creating new chat');
      // Tạo cuộc trò chuyện mới
      final int id = DateTime.now().millisecondsSinceEpoch;
      final String encryptKey = EncryptionHelper.generateEncryptKey();

      chatV2Print('Generated new chat ID: $id');

      // 1. Tạo chat mới
      await getFromTable('chats').insert({
        'id': id,
        'is_group': false,
        'created_at': id,
        'encryption_key': encryptKey,
      });

      chatV2Print('Created new chat in database');

      // 2. Thêm thành viên
      await getFromTable('chat_members').insert([
        {
          'chat_id': id,
          'user_id': username,
          'joined_at': id,
          'latest_seen_at': id,
        },
        {
          'chat_id': id,
          'user_id': loggedUsername,
          'joined_at': id,
          'latest_seen_at': id,
        }
      ]);

      chatV2Print('Added members to new chat');

      return (await findConversationById(id))!;
    }
  } catch (e) {
    chatV2Print('Error in findOrCreateSoloConversation: $e');
    throw e;
  }
}