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

71 lines
2.1 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/projects/data/project_mapper.dart';
import 'package:timetrack/features/projects/data/projects_repository.dart';
import 'package:timetrack/features/projects/domain/project.dart';
part 'drift_projects_repository.g.dart';
class DriftProjectsRepository implements ProjectsRepository {
DriftProjectsRepository(this._db);
final db.AppDatabase _db;
@override
Stream<List<Project>> watchAll() => _db.projectsDao
.watchAll()
.map((rows) => rows.map((r) => r.toDomain()).toList());
@override
Stream<List<Project>> watchActive() => _db.projectsDao
.watchActive()
.map((rows) => rows.map((r) => r.toDomain()).toList());
@override
Future<Project?> getById(int id) async {
final row = await _db.projectsDao.getById(id);
return row?.toDomain();
}
@override
Future<int> create({
required String name,
required int colorValue,
String? description,
}) =>
_db.projectsDao.insertProject(
db.ProjectsCompanion.insert(
name: name,
colorValue: colorValue,
description: Value(description),
),
);
@override
Future<void> update(Project project) => _db.projectsDao.updateProject(
db.ProjectsCompanion(
id: Value(project.id),
name: Value(project.name),
colorValue: Value(project.colorValue),
description: Value(project.description),
archivedAt: Value(project.archivedAt),
),
);
@override
Future<void> archive(int id) => _db.projectsDao.archiveProject(id);
@override
Future<void> unarchive(int id) => _db.projectsDao.unarchiveProject(id);
@override
Future<void> delete(int id) => _db.projectsDao.deleteProject(id);
}
@riverpod
ProjectsRepository projectsRepository(ProjectsRepositoryRef ref) {
final database = ref.watch(db.appDatabaseProvider);
return DriftProjectsRepository(database);
}