upsertMany method

Future<List<T?>> upsertMany({
  1. required List<Map<String, dynamic>> records,
  2. required List<String> uniqueBy,
  3. List<String>? excludeUpdatedData,
  4. Map<String, dynamic> createDataBuilder(
    1. Map<String, dynamic> record
    )?,
  5. Map<String, dynamic> updateDataBuilder(
    1. Map<String, dynamic> record
    )?,
})

Implementation

Future<List<T?>> upsertMany({
  required List<Map<String, dynamic>> records,
  required List<String> uniqueBy,

  /// Old shared payload API
  List<String>? excludeUpdatedData,

  /// Optional transformers for new API
  Map<String, dynamic> Function(Map<String, dynamic> record)?
      createDataBuilder,
  Map<String, dynamic> Function(Map<String, dynamic> record)?
      updateDataBuilder,
}) async {
  if (records.isEmpty) return [];

  if (uniqueBy.isEmpty) {
    throw Exception('upsertMany requires at least one unique column');
  }

  final results = <T?>[];

  for (final record in records) {
    final where = <String, dynamic>{};

    for (final key in uniqueBy) {
      if (!record.containsKey(key)) {
        throw Exception(
          'Missing unique key "$key" in record: $record',
        );
      }
      where[key] = record[key];
    }

    final model = await resetQuery().upsert(
      where: where,
      data: createDataBuilder == null && updateDataBuilder == null
          ? record
          : null,
      createData: createDataBuilder?.call(record),
      updateData: updateDataBuilder?.call(record),
      excludeUpdatedData: excludeUpdatedData,
    );

    results.add(model);
  }

  return results;
}