mnemo_cards/mnemo_cards_backend/lib/database/daos/task_dao.dart

150 lines
5 KiB
Dart
Raw Normal View History

2025-12-13 13:27:05 +00:00
import 'package:drift/drift.dart';
2025-12-13 23:35:14 +00:00
import 'package:drift_postgres/drift_postgres.dart';
2025-12-13 13:27:05 +00:00
import '../database.dart';
part 'task_dao.g.dart';
@DriftAccessor()
class TaskDao extends DatabaseAccessor<AppDatabase> with _$TaskDaoMixin {
TaskDao(super.db);
// ==================== Tasks ====================
/// Получить задачу по ID
2025-12-13 20:55:50 +00:00
Future<Task?> getTaskById(String id) {
2025-12-13 13:27:05 +00:00
return (select(db.tasks)..where((t) => t.id.equals(id))).getSingleOrNull();
}
/// Получить все задачи
Future<List<Task>> getAllTasks() {
return select(db.tasks).get();
}
/// Создать задачу
2025-12-13 20:55:50 +00:00
Future<String> createTask(TasksCompanion task) async {
final inserted = await into(db.tasks).insertReturning(task);
return inserted.id;
2025-12-13 13:27:05 +00:00
}
/// Обновить задачу
Future<bool> updateTask(Task task) {
return update(db.tasks).replace(task);
}
/// Обновить время последнего выполнения
2025-12-13 20:55:50 +00:00
Future<void> updateLastExecution(String taskId) {
2025-12-13 23:35:14 +00:00
final now = PgDateTime(DateTime.now());
2025-12-13 13:27:05 +00:00
return (update(db.tasks)..where((t) => t.id.equals(taskId)))
.write(TasksCompanion(
2025-12-13 23:35:14 +00:00
lastExecution: Value(now),
updatedAt: Value(now),
2025-12-13 13:27:05 +00:00
));
}
// ==================== UserTasks ====================
/// Получить задачу пользователя по ID
2025-12-13 20:55:50 +00:00
Future<UserTask?> getUserTaskById(String id) {
2025-12-13 13:27:05 +00:00
return (select(db.userTasks)..where((ut) => ut.id.equals(id))).getSingleOrNull();
}
2025-12-13 14:48:00 +00:00
/// Получить все задачи пользователей (для системных задач)
Future<List<UserTask>> getAllUserTasks() {
return select(db.userTasks).get();
}
2025-12-13 13:27:05 +00:00
/// Получить задачи пользователя
2025-12-13 20:55:50 +00:00
Future<List<UserTask>> getUserTasks(String userId, {
2025-12-13 13:27:05 +00:00
String? status,
bool activeOnly = false,
}) {
final query = select(db.userTasks);
2025-12-13 20:55:50 +00:00
// Note: UserTasks table doesn't have userId column, so we can't filter by userId
// This method may need to be refactored if userId filtering is required
2025-12-13 13:27:05 +00:00
if (status != null) {
query.where((ut) => ut.status.equals(status));
}
if (activeOnly) {
2025-12-13 23:35:14 +00:00
final now = PgDateTime(DateTime.now());
2025-12-13 13:27:05 +00:00
query.where((ut) => ut.expiresAt.isBiggerThanValue(now));
}
query.orderBy([(ut) => OrderingTerm.desc(ut.createdAt)]);
return query.get();
}
/// Создать задачу пользователя
2025-12-13 20:55:50 +00:00
Future<String> createUserTask(UserTasksCompanion task) async {
final inserted = await into(db.userTasks).insertReturning(task);
return inserted.id;
2025-12-13 13:27:05 +00:00
}
/// Обновить задачу пользователя
Future<bool> updateUserTask(UserTask task) {
return update(db.userTasks).replace(task);
}
/// Завершить задачу пользователя
2025-12-13 20:55:50 +00:00
Future<void> completeUserTask(String taskId) {
2025-12-13 23:35:14 +00:00
final now = PgDateTime(DateTime.now());
2025-12-13 13:27:05 +00:00
return (update(db.userTasks)..where((ut) => ut.id.equals(taskId)))
.write(UserTasksCompanion(
status: const Value('completed'),
2025-12-13 23:35:14 +00:00
completedAt: Value(now),
updatedAt: Value(now),
2025-12-13 13:27:05 +00:00
));
}
2025-12-13 14:48:00 +00:00
/// Подсчитать задачи пользователя
2025-12-13 20:55:50 +00:00
Future<int> countUserTasks(String userId, {String? status}) async {
2025-12-13 14:48:00 +00:00
final countExpr = db.userTasks.id.count();
final query = selectOnly(db.userTasks)..addColumns([countExpr]);
if (status != null) {
query.where(db.userTasks.status.equals(status));
}
return await query.map((row) => row.read(countExpr)!).getSingle();
}
2025-12-13 13:27:05 +00:00
// ==================== UserTaskProgresses ====================
/// Получить прогресс задачи пользователя
2025-12-13 20:55:50 +00:00
Future<UserTaskProgressesData?> getTaskProgress(String userId, String taskId) {
2025-12-13 13:27:05 +00:00
return (select(db.userTaskProgresses)
..where((utp) => utp.userId.equals(userId) & utp.taskId.equals(taskId))
).getSingleOrNull();
}
/// Создать прогресс задачи
2025-12-13 20:55:50 +00:00
Future<String> createTaskProgress(UserTaskProgressesCompanion progress) async {
final inserted = await into(db.userTaskProgresses).insertReturning(progress);
return inserted.id;
2025-12-13 13:27:05 +00:00
}
/// Обновить прогресс задачи
2025-12-13 20:55:50 +00:00
Future<bool> updateTaskProgress(UserTaskProgressesData progress) {
2025-12-13 13:27:05 +00:00
return update(db.userTaskProgresses).replace(progress);
}
// ==================== UserTaskResults ====================
/// Получить результаты задач пользователя
2025-12-13 20:55:50 +00:00
Future<List<UserTaskResult>> getTaskResults(String userId) {
2025-12-13 13:27:05 +00:00
return (select(db.userTaskResults)
..where((utr) => utr.userId.equals(userId))
..orderBy([(utr) => OrderingTerm.desc(utr.completedAt)])
).get();
}
/// Создать результат задачи
2025-12-13 20:55:50 +00:00
Future<String> createTaskResult(UserTaskResultsCompanion result) async {
final inserted = await into(db.userTaskResults).insertReturning(result);
return inserted.id;
2025-12-13 13:27:05 +00:00
}
}