mnemo_cards/mnemo_cards_backend/lib/cron/tasks_seeder.dart

218 lines
8.1 KiB
Dart
Raw Normal View History

2025-11-16 11:25:27 +00:00
import 'package:isar/isar.dart';
import 'package:mnemo_cards_backend/cron/task.dart';
import 'package:mnemo_cards_common_backend/mnemo_cards_common_backend.dart';
import '../main.dart';
class TasksSeederTask with Task {
@override
String get name => 'tasks_seeder';
@override
Future<void> task() async {
print('Seeding initial user tasks...');
try {
// Check if tasks already exist
final existingTasks = await isar.userTaskModels.where().findAll();
if (existingTasks.isNotEmpty) {
print('Tasks already exist, skipping seeding');
return;
}
final now = DateTime.now();
final weekFromNow = now.add(const Duration(days: 7));
final tasks = [
// App Internal Tasks
UserTaskModel(
title: 'Пройди 3 теста сегодня',
2025-11-16 12:15:21 +00:00
description:
'Заверши три тестовые сессии в приложении для улучшения навыков испанского.',
2025-11-16 11:25:27 +00:00
type: 'app_internal',
difficulty: 'easy',
rewards: [
TaskRewardModel(type: 'xp', amount: 50),
TaskRewardModel(type: 'coins', amount: 10),
],
status: 'available',
createdAt: now,
expiresAt: weekFromNow,
tags: ['tests', 'practice', 'daily'],
),
UserTaskModel(
title: 'Достигни 80% правильных ответов в тесте',
2025-11-16 12:15:21 +00:00
description:
'Пройди тест с результатом не менее 80% правильных ответов.',
2025-11-16 11:25:27 +00:00
type: 'app_internal',
difficulty: 'medium',
rewards: [
TaskRewardModel(type: 'xp', amount: 100),
TaskRewardModel(type: 'coins', amount: 25),
],
status: 'available',
createdAt: now,
expiresAt: weekFromNow,
tags: ['tests', 'accuracy', 'challenge'],
),
// External Tasks
UserTaskModel(
title: 'Подпишись на Telegram канал',
2025-11-16 12:15:21 +00:00
description:
'Подпишись на наш Telegram канал @mnemo_cards для получения обновлений и советов по изучению испанского.',
2025-11-16 11:25:27 +00:00
type: 'external',
difficulty: 'easy',
rewards: [
TaskRewardModel(type: 'xp', amount: 30),
TaskRewardModel(type: 'coins', amount: 5),
],
status: 'available',
createdAt: now,
expiresAt: weekFromNow,
tags: ['telegram', 'social', 'subscription'],
),
UserTaskModel(
title: 'Закажи еду на испанском',
2025-11-16 12:15:21 +00:00
description:
'Сделай заказ в ресторане или кафе, используя испанский язык. Запиши процесс на видео для подтверждения.',
2025-11-16 11:25:27 +00:00
type: 'external',
difficulty: 'hard',
rewards: [
TaskRewardModel(type: 'xp', amount: 200),
TaskRewardModel(type: 'coins', amount: 50),
2025-11-16 12:15:21 +00:00
TaskRewardModel(
type: 'achievement',
amount: 0,
achievementId: 'real_world_practice'),
2025-11-16 11:25:27 +00:00
],
status: 'available',
createdAt: now,
expiresAt: weekFromNow.add(const Duration(days: 14)), // 3 weeks
2025-11-16 12:15:21 +00:00
instructions:
'Запиши видео, где ты делаешь заказ на испанском. Убедись, что официант понимает тебя.',
2025-11-16 11:25:27 +00:00
tags: ['speaking', 'restaurant', 'video', 'real_world'],
),
UserTaskModel(
title: 'Посмотри испанский фильм с субтитрами',
2025-11-16 12:15:21 +00:00
description:
'Посмотри испанский фильм или сериал с испанскими субтитрами в течение 30 минут.',
2025-11-16 11:25:27 +00:00
type: 'external',
difficulty: 'medium',
rewards: [
TaskRewardModel(type: 'xp', amount: 75),
TaskRewardModel(type: 'coins', amount: 15),
],
status: 'available',
createdAt: now,
expiresAt: weekFromNow,
tags: ['listening', 'media', 'subtitles'],
),
// Social Tasks
UserTaskModel(
title: 'Поделись прогрессом в соцсетях',
2025-11-16 12:15:21 +00:00
description:
'Поделись своим прогрессом в изучении испанского в социальных сетях с хэштегом #MnemoCards.',
2025-11-16 11:25:27 +00:00
type: 'social',
difficulty: 'easy',
rewards: [
TaskRewardModel(type: 'xp', amount: 40),
TaskRewardModel(type: 'coins', amount: 10),
],
status: 'available',
createdAt: now,
expiresAt: weekFromNow,
tags: ['social', 'sharing', 'progress'],
),
UserTaskModel(
title: 'Найди партнёра для практики',
2025-11-16 12:15:21 +00:00
description:
'Найди собеседника для практики испанского языка (друга, коллегу или через языковые приложения).',
2025-11-16 11:25:27 +00:00
type: 'social',
difficulty: 'medium',
rewards: [
TaskRewardModel(type: 'xp', amount: 90),
TaskRewardModel(type: 'coins', amount: 20),
],
status: 'available',
createdAt: now,
expiresAt: weekFromNow.add(const Duration(days: 7)), // 2 weeks
tags: ['conversation', 'partner', 'practice'],
),
// Additional App Tasks
UserTaskModel(
title: 'Изучай слова ежедневно 7 дней подряд',
2025-11-16 12:15:21 +00:00
description:
'Учи новые слова в приложении каждый день в течение недели.',
2025-11-16 11:25:27 +00:00
type: 'app_internal',
difficulty: 'hard',
rewards: [
TaskRewardModel(type: 'xp', amount: 150),
TaskRewardModel(type: 'coins', amount: 35),
2025-11-16 12:15:21 +00:00
TaskRewardModel(
type: 'achievement',
amount: 0,
achievementId: 'consistency_master'),
2025-11-16 11:25:27 +00:00
],
status: 'available',
createdAt: now,
expiresAt: weekFromNow.add(const Duration(days: 21)), // 4 weeks
tags: ['vocabulary', 'daily', 'streak', 'consistency'],
),
UserTaskModel(
title: 'Пройди тест по грамматике',
2025-11-16 12:15:21 +00:00
description:
'Заверши специализированный тест по грамматике испанского языка.',
2025-11-16 11:25:27 +00:00
type: 'app_internal',
difficulty: 'medium',
rewards: [
TaskRewardModel(type: 'xp', amount: 80),
TaskRewardModel(type: 'coins', amount: 20),
],
status: 'available',
createdAt: now,
expiresAt: weekFromNow,
tags: ['grammar', 'tests', 'knowledge'],
),
UserTaskModel(
title: 'Практикуй произношение',
2025-11-16 12:15:21 +00:00
description:
'Заверши урок по произношению или запиши себя, читая текст на испанском.',
2025-11-16 11:25:27 +00:00
type: 'app_internal',
difficulty: 'easy',
rewards: [
TaskRewardModel(type: 'xp', amount: 60),
TaskRewardModel(type: 'coins', amount: 12),
],
status: 'available',
createdAt: now,
expiresAt: weekFromNow,
tags: ['pronunciation', 'speaking', 'practice'],
),
];
await isar.writeTxn(() async {
for (final task in tasks) {
await isar.userTaskModels.put(task);
}
});
print('Successfully seeded ${tasks.length} user tasks');
} catch (e) {
print('Error seeding tasks: $e');
rethrow;
}
}
@override
int get intervalSeconds => 60 * 60 * 24; // Run once per day
}