serialize<TModel extends SupabaseModel> method
Future<Map<String, dynamic> >
serialize<TModel extends SupabaseModel>(
- TModel instance, {
- String? realtimeFilter,
- String? schema = 'public',
- PostgresChangeEvent? realtimeEvent,
- 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,
},
},
};
}