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])
|
2025-12-20 18:26:15 +00:00
|
|
|
|
class AchievementDao extends DatabaseAccessor<AppDatabase>
|
|
|
|
|
|
with _$AchievementDaoMixin {
|
2025-12-13 13:27:05 +00:00
|
|
|
|
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)
|
2025-12-20 18:26:15 +00:00
|
|
|
|
..where((ua) => ua.userId.equals(userId))
|
|
|
|
|
|
..orderBy([(ua) => OrderingTerm.desc(ua.unlockedAt)]))
|
|
|
|
|
|
.get();
|
2025-12-13 13:27:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Проверить, есть ли у пользователя достижение
|
2025-12-13 20:55:50 +00:00
|
|
|
|
Future<bool> hasAchievement(String userId, String achievementId) async {
|
2025-12-20 18:26:15 +00:00
|
|
|
|
final result =
|
|
|
|
|
|
await (select(userAchievements)..where(
|
|
|
|
|
|
(ua) =>
|
|
|
|
|
|
ua.userId.equals(userId) &
|
|
|
|
|
|
ua.achievementId.equals(achievementId),
|
|
|
|
|
|
))
|
|
|
|
|
|
.getSingleOrNull();
|
2025-12-13 13:27:05 +00:00
|
|
|
|
return result != null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Получить достижение пользователя
|
2025-12-20 18:26:15 +00:00
|
|
|
|
Future<UserAchievement?> getUserAchievement(
|
|
|
|
|
|
String userId,
|
|
|
|
|
|
String achievementId,
|
|
|
|
|
|
) {
|
|
|
|
|
|
return (select(userAchievements)..where(
|
|
|
|
|
|
(ua) =>
|
|
|
|
|
|
ua.userId.equals(userId) & ua.achievementId.equals(achievementId),
|
|
|
|
|
|
))
|
|
|
|
|
|
.getSingleOrNull();
|
2025-12-13 13:27:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Создать достижение пользователя
|
2025-12-20 18:26:15 +00:00
|
|
|
|
Future<String> unlockAchievement(
|
|
|
|
|
|
UserAchievementsCompanion achievement,
|
|
|
|
|
|
) async {
|
2025-12-13 20:55:50 +00:00
|
|
|
|
final inserted = await into(userAchievements).insertReturning(achievement);
|
|
|
|
|
|
return inserted.id;
|
2025-12-13 13:27:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Обновить прогресс достижения
|
2025-12-20 18:26:15 +00:00
|
|
|
|
Future<bool> 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(PgDateTime(DateTime.now())),
|
|
|
|
|
|
),
|
|
|
|
|
|
);
|
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-20 18:26:15 +00:00
|
|
|
|
return (delete(userAchievements)..where(
|
|
|
|
|
|
(ua) =>
|
|
|
|
|
|
ua.userId.equals(userId) & ua.achievementId.equals(achievementId),
|
|
|
|
|
|
))
|
|
|
|
|
|
.go();
|
2025-12-13 13:27:05 +00:00
|
|
|
|
}
|
2025-12-20 18:26:15 +00:00
|
|
|
|
}
|