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

68 lines
2.7 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';
import '../tables/achievements.dart';
part 'achievement_dao.g.dart';
@DriftAccessor(tables: [UserAchievements])
class AchievementDao extends DatabaseAccessor<AppDatabase> with _$AchievementDaoMixin {
AchievementDao(super.db);
// ==================== UserAchievements ====================
/// Получить все достижения пользователя
2025-12-13 20:55:50 +00:00
Future<List<UserAchievement>> getUserAchievements(String userId) {
2025-12-13 13:27:05 +00:00
return (select(userAchievements)
..where((ua) => ua.userId.equals(userId))
..orderBy([(ua) => OrderingTerm.desc(ua.unlockedAt)])
).get();
}
/// Проверить, есть ли у пользователя достижение
2025-12-13 20:55:50 +00:00
Future<bool> hasAchievement(String userId, String achievementId) async {
2025-12-13 13:27:05 +00:00
final result = await (select(userAchievements)
..where((ua) => ua.userId.equals(userId) & ua.achievementId.equals(achievementId))
).getSingleOrNull();
return result != null;
}
/// Получить достижение пользователя
2025-12-13 20:55:50 +00:00
Future<UserAchievement?> getUserAchievement(String userId, String achievementId) {
2025-12-13 13:27:05 +00:00
return (select(userAchievements)
..where((ua) => ua.userId.equals(userId) & ua.achievementId.equals(achievementId))
).getSingleOrNull();
}
/// Создать достижение пользователя
2025-12-13 20:55:50 +00:00
Future<String> unlockAchievement(UserAchievementsCompanion achievement) async {
final inserted = await into(userAchievements).insertReturning(achievement);
return inserted.id;
2025-12-13 13:27:05 +00:00
}
/// Обновить прогресс достижения
2025-12-13 20:55:50 +00:00
Future<bool> updateAchievementProgress(String userId, String achievementId, double progress) async {
2025-12-13 14:48:00 +00:00
final count = await (update(userAchievements)
2025-12-13 13:27:05 +00:00
..where((ua) => ua.userId.equals(userId) & ua.achievementId.equals(achievementId))
).write(UserAchievementsCompanion(
progress: Value(progress),
2025-12-13 23:35:14 +00:00
updatedAt: Value(PgDateTime(DateTime.now())),
2025-12-13 13:27:05 +00:00
));
2025-12-13 14:48:00 +00:00
return count > 0;
2025-12-13 13:27:05 +00:00
}
/// Получить прогресс по всем достижениям пользователя
2025-12-13 20:55:50 +00:00
Future<Map<String, double>> getAchievementProgress(String userId) async {
2025-12-13 13:27:05 +00:00
final achievements = await getUserAchievements(userId);
return Map.fromEntries(
achievements.map((a) => MapEntry(a.achievementId, a.progress)),
);
}
/// Удалить достижение пользователя (для сброса)
2025-12-13 20:55:50 +00:00
Future<void> removeAchievement(String userId, String achievementId) {
2025-12-13 14:48:00 +00:00
return (delete(userAchievements)
2025-12-13 13:27:05 +00:00
..where((ua) => ua.userId.equals(userId) & ua.achievementId.equals(achievementId))
).go();
}
}