queries method

  1. @override
Future<List<UnpuberPackage>> queries({
  1. required int size,
  2. required int page,
  3. required String sort,
  4. required String keyword,
  5. String? uploader,
  6. 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 = _box.values
      .map((raw) => UnpuberPackage.fromJson(
            _normalizeRecord(jsonDecode(raw) 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);
}