serialize<TModel extends SupabaseModel> method

Future<Map<String, dynamic>> serialize<TModel extends SupabaseModel>(
  1. TModel instance, {
  2. String? realtimeFilter,
  3. String? schema = 'public',
  4. PostgresChangeEvent? realtimeEvent,
  5. ModelRepository<SupabaseModel>? repository,
})

Convert a model to a Supabase response.

For realtime responses, include the realtimeEvent argument.

Implementation

Future<Map<String, dynamic>> serialize<TModel extends SupabaseModel>(
  TModel instance, {
  String? realtimeFilter,
  String? schema = 'public',
  PostgresChangeEvent? realtimeEvent,
  ModelRepository<SupabaseModel>? repository,
}) async {
  assert(realtimeEvent != PostgresChangeEvent.all, '.all events are not serialized');

  final adapter = modelDictionary.adapterFor[TModel]!;
  final serialized = await adapter.toSupabase(
    instance,
    provider: SupabaseProvider(client, modelDictionary: modelDictionary),
    repository: repository,
  );

  if (realtimeEvent == null) return serialized;

  // Delete records from realtime are strictly unique/indexed fields;
  // uniqueness is not tracked by [RuntimeSupabaseColumnDefinition]
  // so filtering out associations is the closest simulation of an incomplete payload
  //
  // Associations are not provided by insert/update either
  for (final value in adapter.fieldsToSupabaseColumns.values) {
    if (value.association) serialized.remove(value.columnName);
  }

  return {
    'ref': null,
    'event': 'postgres_changes',
    'payload': {
      'ids': [realtimeEvent.index],
      'data': {
        'columns': adapter.fieldsToSupabaseColumns.entries
            .map(
              (entry) =>
                  {'name': entry.value.columnName, 'type': 'text', 'type_modifier': 4294967295},
            )
            .toList(),
        'commit_timestamp': '2021-08-01T08:00:30Z',
        'errors': null,
        if (realtimeEvent != PostgresChangeEvent.insert) 'old_record': serialized,
        if (realtimeEvent != PostgresChangeEvent.delete) 'record': serialized,
        'schema': schema,
        'table': adapter.supabaseTableName,
        'type': realtimeEvent.name.toUpperCase(),
        if (realtimeFilter != null) 'filter': realtimeFilter,
      },
    },
  };
}