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');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Обновить статус задачи
|
|
|
|
|
final now = DateTime.now();
|
|
|
|
|
await _db.taskDao.updateUserTask(
|
|
|
|
|
task.copyWith(
|
|
|
|
|
status: 'completed',
|
|
|
|
|
completedAt: drift.Value(now),
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Создать запись результата
|
|
|
|
|
await _db.taskDao.createTaskResult(
|
|
|
|
|
UserTaskResultsCompanion.insert(
|
|
|
|
|
userId: userId,
|
|
|
|
|
taskId: taskId,
|
|
|
|
|
results: drift.Value({'completed': true, 'completedAt': now.toIso8601String()}),
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Получить прогресс выполнения задач пользователя
|
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
|
|
|
}
|