findOrCreateGroupConversation static method

Future<ChatModel> findOrCreateGroupConversation({
  1. int? conversationId,
  2. List<String>? groupUserIds,
  3. String? groupName,
  4. String? picture,
})

Implementation

static Future<ChatModel> findOrCreateGroupConversation({
  int? conversationId,
  List<String>? groupUserIds,
  String? groupName,
  String? picture,
}) async {
  UserStatusHelper.setMyLastSeenAt();
  try {
    if (conversationId != null) {
      // Tìm group chat hiện có
      final existingChat = await getFromTable('chats').select('''
            *,
            chat_members (
              user_id,
              is_admin,
              joined_at,
              latest_seen_at
            )
          ''').eq('id', conversationId).eq('is_group', true).single();

      if (existingChat.isNotEmpty) {
        return ChatModel.fromJson(existingChat);
      }
    }

    // Tạo group chat mới
    final timestamp = DateTime.now().millisecondsSinceEpoch;
    final id = conversationId ?? timestamp;

    // 1. Tạo chat mới
    await getFromTable('chats').insert({
      'id': id,
      'name': groupName,
      'picture': picture,
      'is_group': true,
      'created_by': loggedUsername,
      'created_at': DateTime.now().toIso8601String(),
      'encryption_key': EncryptionHelper.generateEncryptKey(),
    });

    // 2. Thêm các thành viên
    final members = [...groupUserIds!, loggedUsername].map((userId) => ({
          'chat_id': id,
          'user_id': userId,
          'joined_at': timestamp,
          'latest_seen_at': timestamp,
          'is_admin': userId == loggedUsername, // Creator là admin
        }));

    await getFromTable('chat_members').insert(members.toList());

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