168 lines
4.4 KiB
Dart
168 lines
4.4 KiB
Dart
import '../datasources/local/folder_dao.dart';
|
||
import '../models/hive_image_folder.dart';
|
||
import '../../domain/entities/image_folder.dart';
|
||
import 'folder_repository.dart';
|
||
|
||
/// 文件夹仓库实现类 - 基于Hive数据库的文件夹操作实现
|
||
/// 负责处理文件夹数据的持久化存储和检索
|
||
class FolderRepositoryImpl implements FolderRepository {
|
||
final FolderDao _folderDao;
|
||
|
||
FolderRepositoryImpl(this._folderDao);
|
||
|
||
@override
|
||
Future<List<ImageFolder>> getAllFolders() async {
|
||
try {
|
||
final folders = await _folderDao.getAllFolders();
|
||
return folders;
|
||
} catch (e) {
|
||
throw Exception('获取文件夹列表失败: $e');
|
||
}
|
||
}
|
||
|
||
@override
|
||
Future<ImageFolder?> getFolderById(String id) async {
|
||
try {
|
||
final folder = await _folderDao.getFolderById(id);
|
||
return folder;
|
||
} catch (e) {
|
||
throw Exception('获取文件夹失败: $e');
|
||
}
|
||
}
|
||
|
||
@override
|
||
Future<String> createFolder({
|
||
required String name,
|
||
required String icon,
|
||
String? coverImageId,
|
||
}) async {
|
||
try {
|
||
final now = DateTime.now();
|
||
final hiveFolder = HiveImageFolder(
|
||
id: _generateId(),
|
||
name: name,
|
||
coverImageId: coverImageId,
|
||
icon: icon,
|
||
createdAt: now,
|
||
updatedAt: now,
|
||
lastUsedAt: now,
|
||
);
|
||
|
||
await _folderDao.insertHiveFolder(hiveFolder);
|
||
return hiveFolder.id;
|
||
} catch (e) {
|
||
throw Exception('创建文件夹失败: $e');
|
||
}
|
||
}
|
||
|
||
@override
|
||
Future<void> updateFolder({
|
||
required String id,
|
||
required String name,
|
||
required String icon,
|
||
String? coverImageId,
|
||
}) async {
|
||
try {
|
||
final existingFolder = await _folderDao.getHiveFolderById(id);
|
||
if (existingFolder == null) {
|
||
throw Exception('文件夹不存在');
|
||
}
|
||
|
||
final updatedFolder = HiveImageFolder(
|
||
id: id,
|
||
name: name,
|
||
coverImageId: coverImageId,
|
||
icon: icon,
|
||
createdAt: existingFolder.createdAt,
|
||
updatedAt: DateTime.now(),
|
||
lastUsedAt: existingFolder.lastUsedAt,
|
||
);
|
||
|
||
await _folderDao.updateHiveFolder(updatedFolder);
|
||
} catch (e) {
|
||
throw Exception('更新文件夹失败: $e');
|
||
}
|
||
}
|
||
|
||
@override
|
||
Future<void> deleteFolder(String id) async {
|
||
try {
|
||
await _folderDao.deleteFolder(id);
|
||
} catch (e) {
|
||
throw Exception('删除文件夹失败: $e');
|
||
}
|
||
}
|
||
|
||
@override
|
||
Future<void> updateFolderLastUsed(String id) async {
|
||
try {
|
||
final existingFolder = await _folderDao.getHiveFolderById(id);
|
||
if (existingFolder == null) {
|
||
throw Exception('文件夹不存在');
|
||
}
|
||
|
||
final updatedFolder = HiveImageFolder(
|
||
id: id,
|
||
name: existingFolder.name,
|
||
coverImageId: existingFolder.coverImageId,
|
||
icon: existingFolder.icon,
|
||
createdAt: existingFolder.createdAt,
|
||
updatedAt: DateTime.now(),
|
||
lastUsedAt: DateTime.now(),
|
||
);
|
||
|
||
await _folderDao.updateHiveFolder(updatedFolder);
|
||
} catch (e) {
|
||
throw Exception('更新文件夹使用时间失败: $e');
|
||
}
|
||
}
|
||
|
||
@override
|
||
Future<int> getFolderImageCount(String id) async {
|
||
try {
|
||
// 这里需要实现获取文件夹中图片数量的逻辑
|
||
// 可能需要调用ImageDAO的相关方法
|
||
// 暂时返回0,后续实现
|
||
return 0;
|
||
} catch (e) {
|
||
throw Exception('获取文件夹图片数量失败: $e');
|
||
}
|
||
}
|
||
|
||
@override
|
||
Future<List<ImageFolder>> getRecentFolders({int limit = 10}) async {
|
||
try {
|
||
final folders = await _folderDao.getRecentFolders(limit: limit);
|
||
return folders;
|
||
} catch (e) {
|
||
throw Exception('获取最近使用的文件夹失败: $e');
|
||
}
|
||
}
|
||
|
||
@override
|
||
Future<List<ImageFolder>> searchFolders(String keyword) async {
|
||
try {
|
||
final folders = await _folderDao.searchFolders(keyword);
|
||
return folders;
|
||
} catch (e) {
|
||
throw Exception('搜索文件夹失败: $e');
|
||
}
|
||
}
|
||
|
||
/// 生成唯一ID
|
||
String _generateId() {
|
||
return DateTime.now().millisecondsSinceEpoch.toString() +
|
||
_generateRandomString(8);
|
||
}
|
||
|
||
/// 生成随机字符串
|
||
String _generateRandomString(int length) {
|
||
const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
|
||
final random = DateTime.now().millisecondsSinceEpoch;
|
||
String result = '';
|
||
for (int i = 0; i < length; i++) {
|
||
result += chars[(random + i) % chars.length];
|
||
}
|
||
return result;
|
||
}
|
||
} |