setTableReplicationTransform<TableDsl extends Table, D> method

  1. @override
void setTableReplicationTransform<TableDsl extends Table, D>(
  1. TableInfo<TableDsl, D> table, {
  2. required Insertable<D> transformInbound(
    1. D row
    ),
  3. required Insertable<D> transformOutbound(
    1. D row
    ),
  4. Insertable<D> toInsertable(
    1. D
    )?,
})
override

Puts transforms in place such that any data being replicated to or from this table is first handled appropriately while retaining type consistency.

Can be used to encrypt sensitive fields before they are replicated outside of their secure local source.

NOTE: usage is discouraged, but ensure transforms are set before replication is initiated using syncTable to avoid partially transformed tables.

Implementation

@override
void setTableReplicationTransform<TableDsl extends Table, D>(
  TableInfo<TableDsl, D> table, {
  required Insertable<D> Function(D row) transformInbound,
  required Insertable<D> Function(D row) transformOutbound,
  Insertable<D> Function(D)? toInsertable,
}) {
  // forbid transforming relation keys to avoid breaking
  // referential integrity
  final relations = getTableRelations(table.asDslTable)?.$relationsList ?? [];
  final immutableFields = relations.map((r) => r.fromField).toList();

  final QualifiedTablename qualifiedTableName = _getQualifiedTableName(table);

  // ignore: invalid_use_of_protected_member
  _baseClient.replicationTransformManager.setTableTransform(
    qualifiedTableName,
    ReplicatedRowTransformer(
      transformInbound: (DbRecord record) {
        final dataClass = table.map(record) as D;
        final insertable = transformTableRecord<TableDsl, D, DbRecord>(
          table,
          dataClass,
          transformInbound,
          immutableFields,
          toInsertable: toInsertable,
        );
        return insertable
            .toColumns(false)
            .map((key, val) => MapEntry(key, expressionToValue(val)));
      },
      transformOutbound: (DbRecord record) {
        final dataClass = table.map(record) as D;
        final insertable = transformTableRecord<TableDsl, D, DbRecord>(
          table,
          dataClass,
          transformOutbound,
          immutableFields,
          toInsertable: toInsertable,
        );
        return insertable
            .toColumns(false)
            .map((key, val) => MapEntry(key, expressionToValue(val)));
      },
    ),
  );
}