timetracker/lib/features/entries/data/drift_entries_repository.dart
2026-08-03 21:51:48 +02:00

70 lines
2.3 KiB
Dart

import 'package:drift/drift.dart' show Value;
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:timetrack/core/database/app_database.dart' as db;
import 'package:timetrack/features/entries/data/entries_repository.dart';
import 'package:timetrack/features/entries/data/time_entry_mapper.dart';
import 'package:timetrack/features/entries/domain/time_entry.dart';
part 'drift_entries_repository.g.dart';
class DriftTimeEntriesRepository implements TimeEntriesRepository {
DriftTimeEntriesRepository(this._db);
final db.AppDatabase _db;
@override
Stream<List<TimeEntry>> watchAll() =>
_db.timeEntriesDao.watchAll().asyncMap(_enrichWithTags);
@override
Stream<List<TimeEntry>> watchByProject(int projectId) =>
_db.timeEntriesDao.watchByProject(projectId).asyncMap(_enrichWithTags);
@override
Stream<List<TimeEntry>> watchByDateRange(DateTime from, DateTime to) =>
_db.timeEntriesDao.watchByDateRange(from, to).asyncMap(_enrichWithTags);
@override
Future<TimeEntry?> getActiveEntry() async {
final row = await _db.timeEntriesDao.getActiveEntry();
if (row == null) return null;
final tags = await _db.timeEntriesDao.getTagsForEntry(row.id);
return row.toDomain(tags: tags.map((t) => t.name).toList());
}
@override
Future<int> create(TimeEntry entry) async {
final id = await _db.timeEntriesDao.insertEntry(entry.toInsertCompanion());
if (entry.tags.isNotEmpty) {
await _db.tagsDao.setTagsForEntry(id, entry.tags);
}
return id;
}
@override
Future<void> update(TimeEntry entry) async {
await _db.timeEntriesDao.updateEntry(
entry.toInsertCompanion().copyWith(id: Value(entry.id)),
);
await _db.tagsDao.setTagsForEntry(entry.id, entry.tags);
}
@override
Future<void> delete(int id) => _db.timeEntriesDao.deleteEntry(id);
Future<List<TimeEntry>> _enrichWithTags(List<db.TimeEntry> rows) async {
final result = <TimeEntry>[];
for (final row in rows) {
final tags = await _db.timeEntriesDao.getTagsForEntry(row.id);
result.add(row.toDomain(tags: tags.map((t) => t.name).toList()));
}
return result;
}
}
@riverpod
TimeEntriesRepository timeEntriesRepository(TimeEntriesRepositoryRef ref) {
final database = ref.watch(db.appDatabaseProvider);
return DriftTimeEntriesRepository(database);
}