queries method
Future<List<UnpuberPackage> >
queries({
- required int size,
- required int page,
- required String sort,
- required String keyword,
- String? uploader,
- String? dependency,
override
Implementation
@override
Future<List<UnpuberPackage>> queries({
required int size,
required int page,
required String sort,
required String keyword,
String? uploader,
String? dependency,
}) async {
final normalizedKeyword = keyword.trim().toLowerCase();
var items = _db
.select('SELECT record FROM meta')
.map((row) => UnpuberPackage.fromJson(
_normalizeRecord(
jsonDecode(row['record'] as String) as Map<String, dynamic>,
),
))
.where((pkg) {
final byName = normalizedKeyword.isEmpty ||
pkg.name.toLowerCase().contains(normalizedKeyword);
final byUploader = uploader == null ||
uploader.isEmpty ||
[...?pkg.uploaders].any((it) => it.contains(uploader));
final latestPubspec =
pkg.versions.isEmpty ? <String, dynamic>{} : pkg.versions.last.pubspec;
final deps =
(latestPubspec['dependencies'] as Map?)?.keys.cast<String>() ?? const <String>[];
final byDependency =
dependency == null || dependency.isEmpty || deps.contains(dependency);
return byName && byUploader && byDependency;
}).toList();
switch (sort) {
case 'createdAt':
case 'updated':
items.sort((a, b) => b.updatedAt.compareTo(a.updatedAt));
break;
case 'download':
default:
items.sort((a, b) => (b.downloads ?? 0).compareTo(a.downloads ?? 0));
break;
}
final offset = page * size;
if (offset >= items.length) {
return <UnpuberPackage>[];
}
final end = (offset + size) > items.length ? items.length : (offset + size);
return items.sublist(offset, end);
}