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> getAllFolders() async { try { final folders = await _folderDao.getAllFolders(); return folders; } catch (e) { throw Exception('获取文件夹列表失败: $e'); } } @override Future getFolderById(String id) async { try { final folder = await _folderDao.getFolderById(id); return folder; } catch (e) { throw Exception('获取文件夹失败: $e'); } } @override Future 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 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 deleteFolder(String id) async { try { await _folderDao.deleteFolder(id); } catch (e) { throw Exception('删除文件夹失败: $e'); } } @override Future 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 getFolderImageCount(String id) async { try { // 这里需要实现获取文件夹中图片数量的逻辑 // 可能需要调用ImageDAO的相关方法 // 暂时返回0,后续实现 return 0; } catch (e) { throw Exception('获取文件夹图片数量失败: $e'); } } @override Future> getRecentFolders({int limit = 10}) async { try { final folders = await _folderDao.getRecentFolders(limit: limit); return folders; } catch (e) { throw Exception('获取最近使用的文件夹失败: $e'); } } @override Future> 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; } }