Files
CloudHome-Ops/lib/services/media_service.dart

147 lines
4.1 KiB
Dart
Raw Permalink Normal View History

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<List<MediaAsset>> getMediaAssetList({
int page = 1,
int limit = 20,
}) async {
final response = await _dio.get<dynamic>(
'/sys/mediaAsset/list',
queryParameters: {'page': page, 'limit': limit},
);
final list = _extractList(response.data);
return list
.whereType<Map<String, dynamic>>()
.map(MediaAsset.fromJson)
.toList();
}
/// 获取媒体资产详情。
///
/// GET /sys/mediaAsset/info/{id}
Future<MediaAsset> getMediaAssetInfo(String id) async {
final response = await _dio.get<dynamic>('/sys/mediaAsset/info/$id');
final data = response.data;
if (data is! Map<String, dynamic>) {
throw ApiException(500, '媒体资产信息加载失败:$id');
}
return MediaAsset.fromJson(data);
}
/// 新增或修改媒体资产。
///
/// POST /sys/mediaAsset/save,body 为媒体数据。
Future<void> saveMediaAsset(Map<String, dynamic> data) async {
await _dio.post<dynamic>('/sys/mediaAsset/save', data: data);
}
/// 批量删除媒体资产。
///
/// POST /sys/mediaAsset/delete,body 为 `{ids: [...]}`。
Future<void> deleteMediaAsset(List<int> ids) async {
await _dio.post<dynamic>(
'/sys/mediaAsset/delete',
data: {'ids': ids},
);
}
// ================ 媒体排行榜 ================
/// 获取媒体排行榜 Top 10。
///
/// GET /sys/mediaAssetRank/top10
Future<List<MediaRankItem>> getMediaAssetRankTop10() async {
final response = await _dio.get<dynamic>('/sys/mediaAssetRank/top10');
final list = _extractList(response.data);
return list
.whereType<Map<String, dynamic>>()
.map(MediaRankItem.fromJson)
.toList();
}
/// 设置排行榜(批量设置,覆盖原有列表)。
///
/// POST /sys/mediaAssetRank/set,body 为 `{codeList: [...]}`。
Future<void> setMediaAssetRank(List<String> codeList) async {
await _dio.post<dynamic>(
'/sys/mediaAssetRank/set',
data: {'codeList': codeList},
);
}
/// 从排行榜移除指定媒体。
///
/// POST /sys/mediaAssetRank/remove,body 为 `{code: ...}`。
Future<void> removeMediaAssetRank(String code) async {
await _dio.post<dynamic>(
'/sys/mediaAssetRank/remove',
data: {'code': code},
);
}
/// 将指定媒体上移一位。
///
/// POST /sys/mediaAssetRank/moveUp,body 为 `{code: ...}`。
Future<void> moveUpMediaAssetRank(String code) async {
await _dio.post<dynamic>(
'/sys/mediaAssetRank/moveUp',
data: {'code': code},
);
}
/// 将指定媒体下移一位。
///
/// POST /sys/mediaAssetRank/moveDown,body 为 `{code: ...}`。
Future<void> moveDownMediaAssetRank(String code) async {
await _dio.post<dynamic>(
'/sys/mediaAssetRank/moveDown',
data: {'code': code},
);
}
/// 清空排行榜。
///
/// POST /sys/mediaAssetRank/clear
Future<void> clearMediaAssetRank() async {
await _dio.post<dynamic>('/sys/mediaAssetRank/clear');
}
// ================ 工具方法 ================
/// 兼容列表响应的三种形态:
/// `{list: [...], totalCount}` / `{page: {list, totalCount}}` / 直接数组。
static List<dynamic> _extractList(dynamic data) {
if (data is List) {
return data;
}
if (data is Map<String, dynamic>) {
final list = data['list'];
if (list is List) {
return list;
}
final page = data['page'];
if (page is Map<String, dynamic> && page['list'] is List) {
return page['list'] as List;
}
}
return const <dynamic>[];
}
}