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 {
  var query = "SELECT record FROM meta WHERE 1=1";
  final params = <dynamic>[];

  query += " AND LOWER(json_extract(record, '\$.name')) LIKE LOWER(?)";
  params.add('%$keyword%');

  if (uploader != null && uploader.isNotEmpty) {
    query +=
        " AND EXISTS (SELECT 1 FROM json_each(record, '\$.uploaders') WHERE value LIKE ?)";
    params.add('%$uploader%');
  }

  if (dependency != null && dependency.isNotEmpty) {
    query +=
        " AND json_extract(record, '\$.versions[0].pubspec.dependencies.$dependency') IS NOT NULL";
  }

  switch (sort) {
    case 'download':
      query += " ORDER BY json_extract(record, '\$.downloads') DESC";
      break;
    case 'createdAt':
      query += " ORDER BY json_extract(record, '\$.createdAt') DESC";
      break;
    default: // 默认按名称排序
      query += " ORDER BY json_extract(record, '\$.name') ASC";
  }

  query += " LIMIT ? OFFSET ?";
  params.add(size);
  params.add(page * size);
  final result = _db.select(query, params);
  if (result.isEmpty) return [];

  return result.map((row) {
    final record = jsonDecode(row['record']) as Map<String, dynamic>;
    return UnpuberPackage.fromJson(record);
  }).toList();
}