mnemo_cards/mnemo_cards_backend/lib/cron/tasks_seeder.dart
2025-11-16 15:15:21 +03:00

217 lines
8.1 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 теста сегодня',
description:
'Заверши три тестовые сессии в приложении для улучшения навыков испанского.',
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% правильных ответов в тесте',
description:
'Пройди тест с результатом не менее 80% правильных ответов.',
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 канал',
description:
'Подпишись на наш Telegram канал @mnemo_cards для получения обновлений и советов по изучению испанского.',
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: 'Закажи еду на испанском',
description:
'Сделай заказ в ресторане или кафе, используя испанский язык. Запиши процесс на видео для подтверждения.',
type: 'external',
difficulty: 'hard',
rewards: [
TaskRewardModel(type: 'xp', amount: 200),
TaskRewardModel(type: 'coins', amount: 50),
TaskRewardModel(
type: 'achievement',
amount: 0,
achievementId: 'real_world_practice'),
],
status: 'available',
createdAt: now,
expiresAt: weekFromNow.add(const Duration(days: 14)), // 3 weeks
instructions:
'Запиши видео, где ты делаешь заказ на испанском. Убедись, что официант понимает тебя.',
tags: ['speaking', 'restaurant', 'video', 'real_world'],
),
UserTaskModel(
title: 'Посмотри испанский фильм с субтитрами',
description:
'Посмотри испанский фильм или сериал с испанскими субтитрами в течение 30 минут.',
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: 'Поделись прогрессом в соцсетях',
description:
'Поделись своим прогрессом в изучении испанского в социальных сетях с хэштегом #MnemoCards.',
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: 'Найди партнёра для практики',
description:
'Найди собеседника для практики испанского языка (друга, коллегу или через языковые приложения).',
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 дней подряд',
description:
'Учи новые слова в приложении каждый день в течение недели.',
type: 'app_internal',
difficulty: 'hard',
rewards: [
TaskRewardModel(type: 'xp', amount: 150),
TaskRewardModel(type: 'coins', amount: 35),
TaskRewardModel(
type: 'achievement',
amount: 0,
achievementId: 'consistency_master'),
],
status: 'available',
createdAt: now,
expiresAt: weekFromNow.add(const Duration(days: 21)), // 4 weeks
tags: ['vocabulary', 'daily', 'streak', 'consistency'],
),
UserTaskModel(
title: 'Пройди тест по грамматике',
description:
'Заверши специализированный тест по грамматике испанского языка.',
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: 'Практикуй произношение',
description:
'Заверши урок по произношению или запиши себя, читая текст на испанском.',
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
}