listMedia method

  1. @override
Future<MediaPage> listMedia({
  1. String? search,
  2. MediaTypeFilter? type,
  3. MediaSort sort = MediaSort.dateDesc,
  4. int limit = 50,
  5. int offset = 0,
})
override

List/search media assets with filtering and sorting.

Implementation

@override
Future<MediaPage> listMedia({
  String? search,
  MediaTypeFilter? type,
  MediaSort sort = MediaSort.dateDesc,
  int limit = 50,
  int offset = 0,
}) async {
  var items = _media.values.toList();

  // Filter by search
  if (search != null && search.isNotEmpty) {
    final query = search.toLowerCase();
    items = items
        .where((a) => a.fileName.toLowerCase().contains(query))
        .toList();
  }

  // Filter by type
  if (type != null && type != MediaTypeFilter.all) {
    items = items.where((a) {
      return switch (type) {
        MediaTypeFilter.image => a.mimeType.startsWith('image/'),
        MediaTypeFilter.video => a.mimeType.startsWith('video/'),
        MediaTypeFilter.file =>
          !a.mimeType.startsWith('image/') &&
              !a.mimeType.startsWith('video/'),
        MediaTypeFilter.all => true,
      };
    }).toList();
  }

  // Sort
  items.sort((a, b) {
    return switch (sort) {
      MediaSort.dateDesc => b.createdAt.compareTo(a.createdAt),
      MediaSort.dateAsc => a.createdAt.compareTo(b.createdAt),
      MediaSort.nameAsc => a.fileName.toLowerCase().compareTo(
        b.fileName.toLowerCase(),
      ),
      MediaSort.nameDesc => b.fileName.toLowerCase().compareTo(
        a.fileName.toLowerCase(),
      ),
      MediaSort.sizeDesc => b.fileSize.compareTo(a.fileSize),
      MediaSort.sizeAsc => a.fileSize.compareTo(b.fileSize),
    };
  });

  final total = items.length;
  final paged = items.skip(offset).take(limit).toList();
  return MediaPage(items: paged, total: total);
}