loadEvents method
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();
}