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

147 lines
4.1 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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>[];
}
}