pull method

  1. @override
Future<List<SyncRecord>> pull({
  1. required String collection,
  2. DateTime? since,
  3. int? limit,
  4. int? offset,
  5. SyncFilter? filter,
})
override

Pull data from backend with optional pagination and filtering

Parameters:

  • collection: Collection name to pull from
  • since: Only pull records modified after this timestamp
  • limit: Maximum number of records to pull
  • offset: Number of records to skip (for pagination)
  • filter: Optional sync filter for selective synchronization

Implementation

@override
Future<List<SyncRecord>> pull({
  required String collection,
  DateTime? since,
  int? limit,
  int? offset,
  SyncFilter? filter,
}) async {
  List<String> queries = [];
  final effectiveSince = filter?.since ?? since;
  if (effectiveSince != null) {
    queries.add(
        Query.greaterThan('updated_at', effectiveSince.toIso8601String()));
  }
  if (filter?.where != null) {
    for (final entry in filter!.where!.entries) {
      queries.add(Query.equal('data.${entry.key}', entry.value));
    }
  }
  final effectiveLimit = filter?.limit ?? limit;
  if (effectiveLimit != null) queries.add(Query.limit(effectiveLimit));
  if (offset != null) queries.add(Query.offset(offset));

  // ignore: deprecated_member_use
  final response = await databases.listDocuments(
    databaseId: databaseId,
    collectionId: collection,
    queries: queries,
  );

  return response.documents.map((doc) {
    var recordData = doc.data['data'] as Map<String, dynamic>;
    if (filter != null) recordData = filter.applyFieldFilter(recordData);
    return SyncRecord(
      recordId: doc.$id,
      data: recordData,
      updatedAt: DateTime.parse(doc.data['updated_at'] as String),
      version: doc.data['version'] as int? ?? 1,
    );
  }).toList();
}