snap_wish/lib/data/repositories/folder_repository_impl.dart
2025-10-09 17:10:38 +08:00

168 lines
4.4 KiB
Dart
Raw Permalink 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 '../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;
}
}