import 'package:dio/dio.dart'; import '../models/media_asset.dart'; import 'api_client.dart'; /// 媒体资源管理服务:媒体资产与排行榜。 /// /// 对接真实「爱视后台」: /// - 媒体资产:/api/sys/mediaAsset/* /// - 媒体排行榜:/api/sys/mediaAssetRank/* class MediaService { MediaService({Dio? dio}) : _dio = dio ?? ApiClient.instance.dio; final Dio _dio; // ================ 媒体资产管理 ================ /// 获取媒体资产列表(分页)。 /// /// GET /sys/mediaAsset/list?page=&limit= Future> getMediaAssetList({ int page = 1, int limit = 20, }) async { final response = await _dio.get( '/sys/mediaAsset/list', queryParameters: {'page': page, 'limit': limit}, ); final list = _extractList(response.data); return list .whereType>() .map(MediaAsset.fromJson) .toList(); } /// 获取媒体资产详情。 /// /// GET /sys/mediaAsset/info/{id} Future getMediaAssetInfo(String id) async { final response = await _dio.get('/sys/mediaAsset/info/$id'); final data = response.data; if (data is! Map) { throw ApiException(500, '媒体资产信息加载失败:$id'); } return MediaAsset.fromJson(data); } /// 新增或修改媒体资产。 /// /// POST /sys/mediaAsset/save,body 为媒体数据。 Future saveMediaAsset(Map data) async { await _dio.post('/sys/mediaAsset/save', data: data); } /// 批量删除媒体资产。 /// /// POST /sys/mediaAsset/delete,body 为 `{ids: [...]}`。 Future deleteMediaAsset(List ids) async { await _dio.post( '/sys/mediaAsset/delete', data: {'ids': ids}, ); } // ================ 媒体排行榜 ================ /// 获取媒体排行榜 Top 10。 /// /// GET /sys/mediaAssetRank/top10 Future> getMediaAssetRankTop10() async { final response = await _dio.get('/sys/mediaAssetRank/top10'); final list = _extractList(response.data); return list .whereType>() .map(MediaRankItem.fromJson) .toList(); } /// 设置排行榜(批量设置,覆盖原有列表)。 /// /// POST /sys/mediaAssetRank/set,body 为 `{codeList: [...]}`。 Future setMediaAssetRank(List codeList) async { await _dio.post( '/sys/mediaAssetRank/set', data: {'codeList': codeList}, ); } /// 从排行榜移除指定媒体。 /// /// POST /sys/mediaAssetRank/remove,body 为 `{code: ...}`。 Future removeMediaAssetRank(String code) async { await _dio.post( '/sys/mediaAssetRank/remove', data: {'code': code}, ); } /// 将指定媒体上移一位。 /// /// POST /sys/mediaAssetRank/moveUp,body 为 `{code: ...}`。 Future moveUpMediaAssetRank(String code) async { await _dio.post( '/sys/mediaAssetRank/moveUp', data: {'code': code}, ); } /// 将指定媒体下移一位。 /// /// POST /sys/mediaAssetRank/moveDown,body 为 `{code: ...}`。 Future moveDownMediaAssetRank(String code) async { await _dio.post( '/sys/mediaAssetRank/moveDown', data: {'code': code}, ); } /// 清空排行榜。 /// /// POST /sys/mediaAssetRank/clear Future clearMediaAssetRank() async { await _dio.post('/sys/mediaAssetRank/clear'); } // ================ 工具方法 ================ /// 兼容列表响应的三种形态: /// `{list: [...], totalCount}` / `{page: {list, totalCount}}` / 直接数组。 static List _extractList(dynamic data) { if (data is List) { return data; } if (data is Map) { final list = data['list']; if (list is List) { return list; } final page = data['page']; if (page is Map && page['list'] is List) { return page['list'] as List; } } return const []; } }