import 'package:drift/drift.dart'; import '../database.dart'; import '../tables/achievements.dart'; part 'achievement_dao.g.dart'; @DriftAccessor(tables: [UserAchievements]) class AchievementDao extends DatabaseAccessor with _$AchievementDaoMixin { AchievementDao(super.db); // ==================== UserAchievements ==================== /// Получить все достижения пользователя Future> getUserAchievements(String userId) { return (select(userAchievements) ..where((ua) => ua.userId.equals(userId)) ..orderBy([(ua) => OrderingTerm.desc(ua.unlockedAt)]) ).get(); } /// Проверить, есть ли у пользователя достижение Future hasAchievement(String userId, String achievementId) async { final result = await (select(userAchievements) ..where((ua) => ua.userId.equals(userId) & ua.achievementId.equals(achievementId)) ).getSingleOrNull(); return result != null; } /// Получить достижение пользователя Future getUserAchievement(String userId, String achievementId) { return (select(userAchievements) ..where((ua) => ua.userId.equals(userId) & ua.achievementId.equals(achievementId)) ).getSingleOrNull(); } /// Создать достижение пользователя Future unlockAchievement(UserAchievementsCompanion achievement) async { final inserted = await into(userAchievements).insertReturning(achievement); return inserted.id; } /// Обновить прогресс достижения Future updateAchievementProgress(String userId, String achievementId, double progress) async { final count = await (update(userAchievements) ..where((ua) => ua.userId.equals(userId) & ua.achievementId.equals(achievementId)) ).write(UserAchievementsCompanion( progress: Value(progress), updatedAt: Value(DateTime.now()), )); return count > 0; } /// Получить прогресс по всем достижениям пользователя Future> getAchievementProgress(String userId) async { final achievements = await getUserAchievements(userId); return Map.fromEntries( achievements.map((a) => MapEntry(a.achievementId, a.progress)), ); } /// Удалить достижение пользователя (для сброса) Future removeAchievement(String userId, String achievementId) { return (delete(userAchievements) ..where((ua) => ua.userId.equals(userId) & ua.achievementId.equals(achievementId)) ).go(); } }