import 'package:hive/hive.dart'; import '../../../data/models/hive_image_folder.dart'; import '../../../domain/entities/image_folder.dart'; import '../local/hive_database.dart'; /// 文件夹数据访问对象 - 负责文件夹的CRUD操作 /// 提供对Hive数据库中文件夹数据的直接访问接口 class FolderDao { /// 获取文件夹数据盒 - 访问Hive文件夹存储 Box get _foldersBox => HiveDatabase.foldersBox; /// 添加文件夹 - 创建新的图片文件夹 /// [folder] 要创建的文件夹实体 /// 返回创建后的文件夹ID Future insertFolder(ImageFolder folder) async { final hiveFolder = HiveImageFolder.fromEntity(folder); await _foldersBox.put(hiveFolder.id, hiveFolder); return hiveFolder.id; } /// 添加Hive文件夹 - 直接插入HiveImageFolder对象 /// [hiveFolder] 要创建的Hive文件夹对象 Future insertHiveFolder(HiveImageFolder hiveFolder) async { await _foldersBox.put(hiveFolder.id, hiveFolder); } /// 根据ID获取文件夹 - 通过唯一标识符查找文件夹 /// [id] 文件夹的唯一标识符 /// 返回找到的文件夹实体,如果不存在则返回null Future getFolderById(String id) async { final hiveFolder = _foldersBox.get(id); return hiveFolder?.toEntity(); } /// 根据ID获取Hive文件夹 - 直接返回HiveImageFolder对象 /// [id] 文件夹的唯一标识符 /// 返回找到的Hive文件夹对象,如果不存在则返回null Future getHiveFolderById(String id) async { return _foldersBox.get(id); } /// 获取所有文件夹 - 按最近使用时间倒序排列 /// 返回所有文件夹实体列表,最近使用的文件夹在前 Future> getAllFolders() async { final hiveFolders = _foldersBox.values .toList() ..sort((a, b) => b.lastUsedAt.compareTo(a.lastUsedAt)); return hiveFolders.map((hiveFolder) => hiveFolder.toEntity()).toList(); } /// 获取最近使用的文件夹 - 获取用户最近访问的文件夹 /// [limit] 返回数量限制,默认返回所有文件夹 /// 返回最近使用的文件夹列表 Future> getRecentFolders({int? limit}) async { final allFolders = await getAllFolders(); if (limit == null || limit >= allFolders.length) { return allFolders; } return allFolders.sublist(0, limit); } /// 获取最近使用的Hive文件夹 - 返回HiveImageFolder对象列表 /// [limit] 返回数量限制 /// 返回最近使用的Hive文件夹列表 Future> getRecentHiveFolders(int limit) async { final hiveFolders = _foldersBox.values .toList() ..sort((a, b) => b.lastUsedAt.compareTo(a.lastUsedAt)); if (limit >= hiveFolders.length) { return hiveFolders; } return hiveFolders.sublist(0, limit); } /// 更新文件夹信息 - 修改文件夹的元数据 /// [folder] 包含更新数据的文件夹实体 /// 返回更新后的文件夹实体 Future updateFolder(ImageFolder folder) async { final hiveFolder = HiveImageFolder( id: folder.id, name: folder.name, coverImageId: folder.coverImageId, icon: folder.icon, createdAt: folder.createdAt, updatedAt: DateTime.now(), // 更新时间 lastUsedAt: folder.lastUsedAt, ); await _foldersBox.put(hiveFolder.id, hiveFolder); return hiveFolder.toEntity(); } /// 更新Hive文件夹 - 直接更新HiveImageFolder对象 /// [hiveFolder] 要更新的Hive文件夹对象 Future updateHiveFolder(HiveImageFolder hiveFolder) async { await _foldersBox.put(hiveFolder.id, hiveFolder); } /// 更新文件夹使用时间 - 记录文件夹的最近访问时间 /// [folderId] 文件夹ID /// 返回更新后的文件夹实体 Future updateFolderLastUsed(String folderId) async { final existingFolder = _foldersBox.get(folderId); if (existingFolder == null) { return null; } // 创建新的HiveImageFolder实例,只更新最后使用时间 final updatedFolder = HiveImageFolder( id: existingFolder.id, name: existingFolder.name, coverImageId: existingFolder.coverImageId, icon: existingFolder.icon, createdAt: existingFolder.createdAt, updatedAt: existingFolder.updatedAt, lastUsedAt: DateTime.now(), // 更新最后使用时间 ); await _foldersBox.put(folderId, updatedFolder); return updatedFolder.toEntity(); } /// 更新文件夹封面 - 设置文件夹的封面图片 /// [folderId] 文件夹ID /// [coverImageId] 封面图片ID,可为null表示移除封面 /// 返回更新后的文件夹实体 Future updateFolderCover(String folderId, String? coverImageId) async { final existingFolder = _foldersBox.get(folderId); if (existingFolder == null) { return null; } // 创建新的HiveImageFolder实例,更新封面和更新时间 final updatedFolder = HiveImageFolder( id: existingFolder.id, name: existingFolder.name, coverImageId: coverImageId, icon: existingFolder.icon, createdAt: existingFolder.createdAt, updatedAt: DateTime.now(), // 更新时间 lastUsedAt: existingFolder.lastUsedAt, ); await _foldersBox.put(folderId, updatedFolder); return updatedFolder.toEntity(); } /// 删除文件夹 - 从数据库中移除指定文件夹 /// [id] 要删除的文件夹ID /// 返回是否删除成功 Future deleteFolder(String id) async { await _foldersBox.delete(id); return true; } /// 检查文件夹是否存在 - 验证指定ID的文件夹是否存在 /// [id] 文件夹ID /// 返回文件夹是否存在 Future folderExists(String id) async { return _foldersBox.containsKey(id); } /// 获取文件夹总数 - 统计数据库中的文件夹数量 /// 返回文件夹总数 Future getFolderCount() async { return _foldersBox.length; } /// 获取默认文件夹 - 获取系统的默认文件夹 /// 如果默认文件夹不存在,则创建它 /// 返回默认文件夹实体 Future getDefaultFolder() async { const defaultFolderId = 'default'; var defaultFolder = _foldersBox.get(defaultFolderId); if (defaultFolder == null) { // 创建默认文件夹 defaultFolder = HiveImageFolder( id: defaultFolderId, name: '默认', icon: 'folder', createdAt: DateTime.now(), updatedAt: DateTime.now(), lastUsedAt: DateTime.now(), ); await _foldersBox.put(defaultFolderId, defaultFolder); } return defaultFolder.toEntity(); } /// 搜索文件夹 - 根据名称模糊搜索文件夹 /// [query] 搜索关键词 /// 返回匹配的文件夹列表 Future> searchFolders(String query) async { final lowerQuery = query.toLowerCase(); final hiveFolders = _foldersBox.values .where((folder) => folder.name.toLowerCase().contains(lowerQuery)) .toList() ..sort((a, b) => b.lastUsedAt.compareTo(a.lastUsedAt)); return hiveFolders.map((hiveFolder) => hiveFolder.toEntity()).toList(); } /// 搜索Hive文件夹 - 返回HiveImageFolder对象列表 /// [query] 搜索关键词 /// 返回匹配的Hive文件夹列表 Future> searchHiveFolders(String query) async { final lowerQuery = query.toLowerCase(); return _foldersBox.values .where((folder) => folder.name.toLowerCase().contains(lowerQuery)) .toList() ..sort((a, b) => b.lastUsedAt.compareTo(a.lastUsedAt)); } /// 关闭数据盒 - 释放数据库资源 /// 通常在应用退出时调用 Future close() async { await _foldersBox.close(); } }