105 lines
4.2 KiB
Dart
105 lines
4.2 KiB
Dart
import 'package:hive_ce/hive.dart';
|
|
import '/data/repositories/interfaces/itransaction_repository.dart';
|
|
import '../../models/transaction_record.dart';
|
|
|
|
class HiveTransactionRepository implements ITransactionRepository {
|
|
final Box<TransactionRecord> _box;
|
|
|
|
HiveTransactionRepository(this._box);
|
|
|
|
@override
|
|
Future<List<TransactionRecord>> getAll() async {
|
|
// Этот метод может быть не нужен в многопользовательском приложении,
|
|
// так как обычно мы хотим видеть транзакции только текущего пользователя.
|
|
// Но оставляем его для полноты интерфейса.
|
|
return _box.values.toList();
|
|
}
|
|
|
|
@override
|
|
Future<TransactionRecord?> getById(String id) async {
|
|
return _box.get(id);
|
|
}
|
|
|
|
@override
|
|
Future<void> add(TransactionRecord transaction) async {
|
|
await _box.put(transaction.id, transaction);
|
|
}
|
|
|
|
@override
|
|
Future<void> update(TransactionRecord transaction) async {
|
|
// Обновление в Hive часто сводится к перезаписи по тому же ключу
|
|
await add(transaction);
|
|
}
|
|
|
|
@override
|
|
Future<void> delete(String id) async {
|
|
await _box.delete(id);
|
|
}
|
|
|
|
@override
|
|
Future<List<TransactionRecord>> getByDateRange(DateTime from, DateTime to) async {
|
|
// Этот метод также может быть изменен для фильтрации по пользователю
|
|
return _box.values
|
|
.where((t) => t.dateTime.isAfter(from) && t.dateTime.isBefore(to))
|
|
.toList();
|
|
}
|
|
|
|
@override
|
|
Future<List<TransactionRecord>> getByCategory(String categoryId) async {
|
|
// Этот метод также может быть изменен для фильтрации по пользователю
|
|
return _box.values
|
|
.where((t) => t.category.id == categoryId)
|
|
.toList();
|
|
}
|
|
|
|
@override
|
|
Future<List<TransactionRecord>> getByTag(String tagId) async {
|
|
// Этот метод также может быть изменен для фильтрации по пользователю
|
|
return _box.values
|
|
.where((t) => t.tag?.id == tagId)
|
|
.toList();
|
|
}
|
|
|
|
// Добавляем новый метод для получения всех транзакций конкретного пользователя
|
|
@override
|
|
Future<List<TransactionRecord>> getAllByUser(String userId) async {
|
|
// Фильтруем все транзакции в Box по userId
|
|
return _box.values.where((t) => t.userId == userId).toList();
|
|
}
|
|
|
|
// Добавляем новый метод для получения транзакций пользователя по диапазону дат
|
|
@override
|
|
Future<List<TransactionRecord>> getByUserAndDateRange(String userId, DateTime from, DateTime to) async {
|
|
// Фильтруем транзакции сначала по userId, затем по диапазону дат
|
|
return _box.values
|
|
.where((t) => t.userId == userId && t.dateTime.isAfter(from) && t.dateTime.isBefore(to))
|
|
.toList();
|
|
}
|
|
|
|
// Добавляем новый метод для получения транзакций пользователя по категории
|
|
@override
|
|
Future<List<TransactionRecord>> getByUserAndCategory(String userId, String categoryId) async {
|
|
// Фильтруем транзакции сначала по userId, затем по категории
|
|
return _box.values
|
|
.where((t) => t.userId == userId && t.category.id == categoryId)
|
|
.toList();
|
|
}
|
|
|
|
// Добавляем новый метод для получения транзакций пользователя по тегу
|
|
@override
|
|
Future<List<TransactionRecord>> getByUserAndTag(String userId, String tagId) async {
|
|
// Фильтруем транзакции сначала по userId, затем по тегу
|
|
return _box.values
|
|
.where((t) => t.userId == userId && t.tag?.id == tagId)
|
|
.toList();
|
|
}
|
|
|
|
@override
|
|
Future<void> addAll(List<TransactionRecord> transactions) async {
|
|
final Map<String, TransactionRecord> transactionMap = {
|
|
for (var tr in transactions) tr.id: tr
|
|
};
|
|
await _box.putAll(transactionMap);
|
|
}
|
|
}
|