updateChannelStates method

Future<void> updateChannelStates(
  1. List<ChannelState> channelStates
)

Update list of channel states

Implementation

Future<void> updateChannelStates(List<ChannelState> channelStates) async {
  final reactionsToDelete = <String>[];
  final pinnedReactionsToDelete = <String>[];
  final membersToDelete = <String>[];

  final channels = <ChannelModel>[];
  final channelWithMessages = <String, List<Message>>{};
  final channelWithPinnedMessages = <String, List<Message>>{};
  final channelWithReads = <String, List<Read>>{};
  final channelWithMembers = <String, List<Member>>{};

  final users = <User>[];
  final reactions = <Reaction>[];
  final pinnedReactions = <Reaction>[];

  for (final state in channelStates) {
    final channel = state.channel;
    if (channel != null) {
      channels.add(channel);

      final cid = channel.cid;
      final reads = state.read;
      final members = state.members;
      final messages = state.messages;
      final pinnedMessages = state.pinnedMessages;

      // Preparing deletion data
      membersToDelete.add(cid);
      reactionsToDelete.addAll(state.messages.map((it) => it.id));
      pinnedReactionsToDelete.addAll(state.pinnedMessages.map((it) => it.id));

      // preparing addition data
      channelWithReads[cid] = reads;
      channelWithMembers[cid] = members;
      channelWithMessages[cid] = messages;
      channelWithPinnedMessages[cid] = pinnedMessages;

      reactions.addAll(messages.expand(_expandReactions));
      pinnedReactions.addAll(pinnedMessages.expand(_expandReactions));

      users.addAll([
        channel.createdBy,
        ...messages.map((it) => it.user),
        ...reads.map((it) => it.user),
        ...members.map((it) => it.user),
        ...reactions.map((it) => it.user),
        ...pinnedReactions.map((it) => it.user),
      ].withNullifyer);
    }
  }

  // Removing old members and reactions data as they may have
  // changes over the time.
  await Future.wait([
    deleteMembersByCids(membersToDelete),
    deleteReactionsByMessageId(reactionsToDelete),
    deletePinnedMessageReactionsByMessageId(pinnedReactionsToDelete),
  ]);

  // Updating first as does not depend on any other table.
  await Future.wait([
    updateUsers(users.toList(growable: false)),
    updateChannels(channels.toList(growable: false)),
  ]);

  // All has a foreign key relation with channels table.
  await Future.wait([
    bulkUpdateReads(channelWithReads),
    bulkUpdateMembers(channelWithMembers),
    bulkUpdateMessages(channelWithMessages),
    bulkUpdatePinnedMessages(channelWithPinnedMessages),
  ]);

  // Both has a foreign key relation with messages, pinnedMessages table.
  await Future.wait([
    updateReactions(reactions.toList(growable: false)),
    updatePinnedMessageReactions(
      pinnedReactions.toList(growable: false),
    ),
  ]);
}