Some checks are pending
Backend CI / test (push) Waiting to run
Backend CI / build (push) Blocked by required conditions
Deploy Mnemo Cards / Deploy Backend (push) Waiting to run
Deploy Mnemo Cards / Deploy Web App (push) Blocked by required conditions
Deploy Mnemo Cards / Final Verification (push) Blocked by required conditions
65 lines
No EOL
2.5 KiB
Dart
65 lines
No EOL
2.5 KiB
Dart
import 'package:drift/drift.dart';
|
||
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 ====================
|
||
|
||
/// Получить все достижения пользователя
|
||
Future<List<UserAchievement>> getUserAchievements(int userId) {
|
||
return (select(userAchievements)
|
||
..where((ua) => ua.userId.equals(userId))
|
||
..orderBy([(ua) => OrderingTerm.desc(ua.unlockedAt)])
|
||
).get();
|
||
}
|
||
|
||
/// Проверить, есть ли у пользователя достижение
|
||
Future<bool> hasAchievement(int userId, String achievementId) async {
|
||
final result = await (select(userAchievements)
|
||
..where((ua) => ua.userId.equals(userId) & ua.achievementId.equals(achievementId))
|
||
).getSingleOrNull();
|
||
return result != null;
|
||
}
|
||
|
||
/// Получить достижение пользователя
|
||
Future<UserAchievement?> getUserAchievement(int userId, String achievementId) {
|
||
return (select(userAchievements)
|
||
..where((ua) => ua.userId.equals(userId) & ua.achievementId.equals(achievementId))
|
||
).getSingleOrNull();
|
||
}
|
||
|
||
/// Создать достижение пользователя
|
||
Future<int> unlockAchievement(UserAchievementsCompanion achievement) {
|
||
return into(userAchievements).insert(achievement);
|
||
}
|
||
|
||
/// Обновить прогресс достижения
|
||
Future<bool> updateAchievementProgress(int userId, String achievementId, double progress) {
|
||
return (update(userAchievements)
|
||
..where((ua) => ua.userId.equals(userId) & ua.achievementId.equals(achievementId))
|
||
).write(UserAchievementsCompanion(
|
||
progress: Value(progress),
|
||
updatedAt: Value(DateTime.now()),
|
||
));
|
||
}
|
||
|
||
/// Получить прогресс по всем достижениям пользователя
|
||
Future<Map<String, double>> getAchievementProgress(int userId) async {
|
||
final achievements = await getUserAchievements(userId);
|
||
return Map.fromEntries(
|
||
achievements.map((a) => MapEntry(a.achievementId, a.progress)),
|
||
);
|
||
}
|
||
|
||
/// Удалить достижение пользователя (для сброса)
|
||
Future<void> removeAchievement(int userId, String achievementId) {
|
||
(delete(userAchievements)
|
||
..where((ua) => ua.userId.equals(userId) & ua.achievementId.equals(achievementId))
|
||
).go();
|
||
}
|
||
} |