sanitizeCloudDataToSend function

Map<String, dynamic> sanitizeCloudDataToSend(
  1. Map<String, dynamic> data, {
  2. required String? docId,
  3. bool hidePrivateFields = false,
  4. bool allowEmptyData = false,
  5. bool autoChangeUpdatedAt = true,
  6. bool keepCreatedAt = false,
})

Returns a sanitized version of the given data to be sent to the cloud storage. Updates the SDKConstants.createdAt and SDKConstants.updatedAt fields with the current time.

Implementation

Map<String, dynamic> sanitizeCloudDataToSend(
  Map<String, dynamic> data, {
  required String? docId,
  bool hidePrivateFields = false,
  bool allowEmptyData = false,
  bool autoChangeUpdatedAt = true,
  bool keepCreatedAt = false,
}) {
  if (data.isEmpty && !allowEmptyData) return data;

  // Breaks reference and allows to modify the data.
  data = {...data};

  // Remove private fields.
  if (hidePrivateFields) {
    for (final field in PrivateDocumentFields.all) {
      data.remove(field);
    }
  } else {
    late final DateTime now = DateTime.now().toUtc();

    if (autoChangeUpdatedAt) {
      if (!keepCreatedAt || data.containsKey(SDKConstants.createdAt)) {
        data[SDKConstants.createdAt] = serializedCosmicValue(
          data[SDKConstants.createdAt] ?? now,
        );
      }
      data[SDKConstants.updatedAt] = serializedCosmicValue(now);
    }

    if (docId != null) {
      data[SDKConstants.id] = docId;
    }

    // Sort private fields to the bottom.
    for (final field in PrivateDocumentFields.all) {
      if (data.containsKey(field)) {
        final value = data.remove(field);
        data[field] = value;
      }
    }
  }

  // Remove any key that is empty. Empty keys are not allowed on Firestore.
  data.remove('');

  return data;
}