228 lines
7.7 KiB
Dart
228 lines
7.7 KiB
Dart
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<HiveImageFolder> get _foldersBox => HiveDatabase.foldersBox;
|
||
|
||
/// 添加文件夹 - 创建新的图片文件夹
|
||
/// [folder] 要创建的文件夹实体
|
||
/// 返回创建后的文件夹ID
|
||
Future<String> insertFolder(ImageFolder folder) async {
|
||
final hiveFolder = HiveImageFolder.fromEntity(folder);
|
||
await _foldersBox.put(hiveFolder.id, hiveFolder);
|
||
return hiveFolder.id;
|
||
}
|
||
|
||
/// 添加Hive文件夹 - 直接插入HiveImageFolder对象
|
||
/// [hiveFolder] 要创建的Hive文件夹对象
|
||
Future<void> insertHiveFolder(HiveImageFolder hiveFolder) async {
|
||
await _foldersBox.put(hiveFolder.id, hiveFolder);
|
||
}
|
||
|
||
/// 根据ID获取文件夹 - 通过唯一标识符查找文件夹
|
||
/// [id] 文件夹的唯一标识符
|
||
/// 返回找到的文件夹实体,如果不存在则返回null
|
||
Future<ImageFolder?> getFolderById(String id) async {
|
||
final hiveFolder = _foldersBox.get(id);
|
||
return hiveFolder?.toEntity();
|
||
}
|
||
|
||
/// 根据ID获取Hive文件夹 - 直接返回HiveImageFolder对象
|
||
/// [id] 文件夹的唯一标识符
|
||
/// 返回找到的Hive文件夹对象,如果不存在则返回null
|
||
Future<HiveImageFolder?> getHiveFolderById(String id) async {
|
||
return _foldersBox.get(id);
|
||
}
|
||
|
||
/// 获取所有文件夹 - 按最近使用时间倒序排列
|
||
/// 返回所有文件夹实体列表,最近使用的文件夹在前
|
||
Future<List<ImageFolder>> getAllFolders() async {
|
||
final hiveFolders = _foldersBox.values
|
||
.toList()
|
||
..sort((a, b) => b.lastUsedAt.compareTo(a.lastUsedAt));
|
||
|
||
return hiveFolders.map((hiveFolder) => hiveFolder.toEntity()).toList();
|
||
}
|
||
|
||
/// 获取最近使用的文件夹 - 获取用户最近访问的文件夹
|
||
/// [limit] 返回数量限制,默认返回所有文件夹
|
||
/// 返回最近使用的文件夹列表
|
||
Future<List<ImageFolder>> 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<List<HiveImageFolder>> 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<ImageFolder> 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<void> updateHiveFolder(HiveImageFolder hiveFolder) async {
|
||
await _foldersBox.put(hiveFolder.id, hiveFolder);
|
||
}
|
||
|
||
/// 更新文件夹使用时间 - 记录文件夹的最近访问时间
|
||
/// [folderId] 文件夹ID
|
||
/// 返回更新后的文件夹实体
|
||
Future<ImageFolder?> 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<ImageFolder?> 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<bool> deleteFolder(String id) async {
|
||
await _foldersBox.delete(id);
|
||
return true;
|
||
}
|
||
|
||
/// 检查文件夹是否存在 - 验证指定ID的文件夹是否存在
|
||
/// [id] 文件夹ID
|
||
/// 返回文件夹是否存在
|
||
Future<bool> folderExists(String id) async {
|
||
return _foldersBox.containsKey(id);
|
||
}
|
||
|
||
/// 获取文件夹总数 - 统计数据库中的文件夹数量
|
||
/// 返回文件夹总数
|
||
Future<int> getFolderCount() async {
|
||
return _foldersBox.length;
|
||
}
|
||
|
||
/// 获取默认文件夹 - 获取系统的默认文件夹
|
||
/// 如果默认文件夹不存在,则创建它
|
||
/// 返回默认文件夹实体
|
||
Future<ImageFolder> 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<List<ImageFolder>> 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<List<HiveImageFolder>> 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<void> close() async {
|
||
await _foldersBox.close();
|
||
}
|
||
} |