insertOrUpdateCollectionByServerId method

Future<void> insertOrUpdateCollectionByServerId(
  1. List<T> entries, {
  2. List<FieldWithValue>? fieldsToCopy,
})

Insert or update a collection of entries, with considering DbModel.serverId as the key.

Insert entries with not inserted serverId before and update the inserted before.

Implementation

Future<void> insertOrUpdateCollectionByServerId(List<T> entries,
    {List<FieldWithValue>? fieldsToCopy}) async {
  try {
    //get serverIds
    List<int> itemServerIds = [
      for (var i in entries)
        if (i.serverId.value != null) i.serverId.value!
    ];

    //get already inserted serverIds
    List<T> insertedItems =
        await select(where: (s) => s.serverId.inCollection(itemServerIds));

    var insertedServerIds =
        insertedItems.map<int>((e) => e.serverId.value!).toList();

    //Get items need to be updated
    for (var item in insertedItems) {
      var newItem =
          entries.firstWhere((i) => i.serverId.value == item.serverId.value);
      item.copyValuesFrom(newItem, fieldsToCopy: fieldsToCopy);
    }

    await updateCollectionByServerId(insertedItems);

    //Get items need to be insered
    var newItems = entries
        .where((e) => !insertedServerIds.contains(e.serverId.value))
        .toList();

    await insertCollection(newItems);
  } catch (e) {
    print('Error: $e');
    return;
  }
}