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

115 lines
3.6 KiB
Dart
Raw Normal View History

2025-12-13 13:27:05 +00:00
import 'package:drift/drift.dart';
import '../database.dart';
import '../tables/tests.dart';
import '../tables/packs.dart';
part 'test_dao.g.dart';
@DriftAccessor(tables: [Tests, TestQuestions, TestPackRelations, TestStatistics])
class TestDao extends DatabaseAccessor<AppDatabase> with _$TestDaoMixin {
TestDao(super.db);
// ==================== Tests ====================
/// Получить тест по ID
2025-12-13 20:55:50 +00:00
Future<Test?> getTestById(String id) {
2025-12-13 13:27:05 +00:00
return (select(tests)..where((t) => t.id.equals(id))).getSingleOrNull();
}
/// Получить все тесты
Future<List<Test>> getAllTests() {
return (select(tests)
..where((t) => t.isDeleted.equals(false))
).get();
}
/// Получить тесты пака
2025-12-13 20:55:50 +00:00
Future<List<Test>> getTestsByPackId(String packId) async {
2025-12-13 13:27:05 +00:00
final query = select(tests).join([
innerJoin(
testPackRelations,
testPackRelations.testId.equalsExp(tests.id) &
testPackRelations.packId.equals(packId),
),
]);
return query.map((row) => row.readTable(tests)).get();
}
/// Создать тест
2025-12-13 20:55:50 +00:00
Future<String> createTest(TestsCompanion test) async {
final inserted = await into(tests).insertReturning(test);
return inserted.id;
2025-12-13 13:27:05 +00:00
}
/// Обновить тест
Future<bool> updateTest(Test test) {
return update(tests).replace(test);
}
/// Удалить тест (soft delete)
2025-12-13 20:55:50 +00:00
Future<void> softDeleteTest(String testId) {
2025-12-13 13:27:05 +00:00
return (update(tests)..where((t) => t.id.equals(testId)))
.write(TestsCompanion(
isDeleted: const Value(true),
updatedAt: Value(DateTime.now()),
));
}
/// Связать тест с паком
2025-12-13 20:55:50 +00:00
Future<void> linkTestToPack(String testId, String packId) async {
2025-12-13 13:27:05 +00:00
await into(testPackRelations).insert(
TestPackRelationsCompanion.insert(
testId: testId,
packId: packId,
),
mode: InsertMode.insertOrIgnore,
);
}
// ==================== TestQuestions ====================
/// Получить вопросы теста
2025-12-13 20:55:50 +00:00
Future<List<TestQuestion>> getTestQuestions(String testId) {
2025-12-13 13:27:05 +00:00
return (select(testQuestions)
..where((tq) => tq.testId.equals(testId))
).get();
}
/// Создать вопрос теста
2025-12-13 20:55:50 +00:00
Future<String> createTestQuestion(TestQuestionsCompanion question) async {
final inserted = await into(testQuestions).insertReturning(question);
return inserted.id;
2025-12-13 13:27:05 +00:00
}
/// Обновить вопрос теста
Future<bool> updateTestQuestion(TestQuestion question) {
return update(testQuestions).replace(question);
}
/// Удалить вопрос теста
2025-12-13 20:55:50 +00:00
Future<void> deleteTestQuestion(String questionId) {
2025-12-13 13:27:05 +00:00
return (delete(testQuestions)..where((tq) => tq.id.equals(questionId))).go();
}
// ==================== TestStatistics ====================
/// Получить статистику теста пользователя
2025-12-13 20:55:50 +00:00
Future<TestStatistic?> getTestStatistics(String userId, String testId) {
2025-12-13 13:27:05 +00:00
return (select(testStatistics)
..where((ts) => ts.userId.equals(userId) & ts.testId.equals(testId))
).getSingleOrNull();
}
/// Создать статистику теста
2025-12-13 20:55:50 +00:00
Future<String> createTestStatistics(TestStatisticsCompanion statistics) async {
final inserted = await into(testStatistics).insertReturning(statistics);
return inserted.id;
2025-12-13 13:27:05 +00:00
}
/// Обновить статистику теста
Future<bool> updateTestStatistics(TestStatistic statistics) {
return update(testStatistics).replace(statistics);
}
}