mnemo_cards/mnemo_cards_backend/lib/tasks/task_manager.dart

130 lines
4.1 KiB
Dart
Raw Normal View History

2025-12-13 23:35:14 +00:00
import 'package:drift_postgres/drift_postgres.dart';
2025-12-13 13:27:05 +00:00
import 'package:injectable/injectable.dart';
import 'package:drift/drift.dart' as drift;
import 'package:mnemo_cards_backend/database/database.dart';
@lazySingleton
class TaskManager {
final AppDatabase _db;
TaskManager(this._db);
/// Получить все доступные задачи пользователя
Future<List<UserTask>> getUserTasks(
2025-12-13 20:55:50 +00:00
String userId, {
2025-12-13 13:27:05 +00:00
String? type,
String? difficulty,
String? status,
List<String>? tags,
int? limit,
int? offset,
}) async {
2025-12-13 14:48:00 +00:00
return await _db.taskDao.getUserTasks(
userId,
status: status,
activeOnly: status == 'available',
);
2025-12-13 13:27:05 +00:00
}
/// Получить задачу по ID
2025-12-13 20:55:50 +00:00
Future<UserTask?> getUserTask(String userId, String taskId) async {
2025-12-13 13:27:05 +00:00
final tasks = await _db.taskDao.getUserTasks(userId);
return tasks.where((task) => task.id == taskId).firstOrNull;
}
/// Начать выполнение задачи
2025-12-13 20:55:50 +00:00
Future<void> startTask(String userId, String taskId) async {
2025-12-13 13:27:05 +00:00
await _db.transaction(() async {
// Проверить, что задача доступна
final task = await getUserTask(userId, taskId);
if (task == null || task.status != 'available') {
throw Exception('Task not available');
}
// Обновить статус задачи
await _db.taskDao.updateUserTask(task.copyWith(status: 'in_progress'));
// Создать запись прогресса
await _db.taskDao.createTaskProgress(
UserTaskProgressesCompanion.insert(
userId: userId,
taskId: taskId,
2025-12-13 14:48:00 +00:00
progress: drift.Value({'started': true} as Map<String, dynamic>),
2025-12-13 13:27:05 +00:00
),
);
});
}
/// Завершить задачу
2025-12-13 20:55:50 +00:00
Future<void> completeTask(String userId, String taskId) async {
2025-12-13 13:27:05 +00:00
await _db.transaction(() async {
// Проверить, что задача в процессе выполнения
final task = await getUserTask(userId, taskId);
if (task == null || task.status != 'in_progress') {
throw Exception('Task not in progress');
}
// Обновить статус задачи
2025-12-13 23:35:14 +00:00
final now = PgDateTime(DateTime.now());
2025-12-13 13:27:05 +00:00
await _db.taskDao.updateUserTask(
task.copyWith(
status: 'completed',
completedAt: drift.Value(now),
),
);
// Создать запись результата
await _db.taskDao.createTaskResult(
UserTaskResultsCompanion.insert(
userId: userId,
taskId: taskId,
2025-12-13 23:35:14 +00:00
results: drift.Value({'completed': true, 'completedAt': now.dateTime.toIso8601String()}),
2025-12-13 13:27:05 +00:00
),
);
});
}
/// Получить прогресс выполнения задач пользователя
2025-12-13 20:55:50 +00:00
Future<List<UserTaskProgressesData>> getUserTaskProgress(String userId) async {
2025-12-13 14:48:00 +00:00
final tasks = await _db.taskDao.getUserTasks(userId);
2025-12-13 20:55:50 +00:00
final progresses = <UserTaskProgressesData>[];
2025-12-13 14:48:00 +00:00
for (final task in tasks) {
final progress = await _db.taskDao.getTaskProgress(userId, task.id);
if (progress != null) {
progresses.add(progress);
}
}
return progresses;
2025-12-13 13:27:05 +00:00
}
/// Получить категории задач
Future<List<String>> getTaskCategories() async {
2025-12-13 14:48:00 +00:00
final tasks = await _db.taskDao.getAllUserTasks();
final categories = <String>{};
for (final task in tasks) {
if (task.type.isNotEmpty) {
categories.add(task.type);
}
}
return categories.toList();
2025-12-13 13:27:05 +00:00
}
/// Создать новую задачу для пользователя
2025-12-13 20:55:50 +00:00
Future<String> createUserTask(UserTasksCompanion task) async {
2025-12-13 13:27:05 +00:00
return await _db.taskDao.createUserTask(task);
}
/// Обновить задачу пользователя
Future<bool> updateUserTask(UserTask task) async {
return await _db.taskDao.updateUserTask(task);
}
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
return await _db.taskDao.countUserTasks(userId, status: status);
}
2025-12-13 13:27:05 +00:00
}