snap_wish/lib/data/datasources/local/folder_dao.dart
2025-10-09 17:10:38 +08:00

228 lines
7.7 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: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();
}
}