loadEvents method

  1. @override
Future<List<Nip01Event>> loadEvents({
  1. List<String>? pubKeys,
  2. List<int>? kinds,
  3. String? pTag,
  4. int? since,
  5. int? until,
  6. int? limit,
})
override

Implementation

@override
Future<List<Nip01Event>> loadEvents({
  List<String>? pubKeys,
  List<int>? kinds,
  String? pTag,
  int? since,
  int? until,
  int? limit,
}) async {
  await dbRdy;
  final eventBox = _objectBox.store.box<DbNip01Event>();
  QueryBuilder<DbNip01Event> query;

  if (pubKeys != null && pubKeys.isNotEmpty) {
    query = kinds != null && kinds.isNotEmpty
        ? eventBox.query(DbNip01Event_.pubKey
            .oneOf(pubKeys)
            .and(DbNip01Event_.kind.oneOf(kinds)))
        : eventBox.query(DbNip01Event_.pubKey.oneOf(pubKeys));
  } else if (kinds != null && kinds.isNotEmpty) {
    query = eventBox.query(DbNip01Event_.kind.oneOf(kinds));
  } else {
    throw Exception("cannot query without either kinds or pubKeys");
  }

  query = query.order(DbNip01Event_.createdAt, flags: Order.descending);

  final Query<DbNip01Event> dbQuery;

  // apply limit
  if (limit != null && limit > 0) {
    dbQuery = query.build()..limit = limit;
  } else {
    dbQuery = query.build();
  }

  // Otherwise, fetch more than needed and filter
  List<DbNip01Event> foundDb = dbQuery.find();

  final foundValid = foundDb.where((event) {
    if (pTag != null && !event.pTags.contains(pTag)) {
      return false;
    }

    if (since != null && event.createdAt < since) {
      return false;
    }

    if (until != null && event.createdAt > until) {
      return false;
    }

    return true;
  }).toList();

  // Apply limit after filtering
  final limitedResults = limit != null && limit > 0
      ? foundValid.take(limit).toList()
      : foundValid;

  return limitedResults.map((dbEvent) => dbEvent.toNdk()).toList();
}