import 'package:drift/drift.dart'; import '../converters.dart' show generateUuid, JsonListConverter, JsonMapConverter, StringListConverter; import '../postgres_constants.dart'; import 'users.dart'; /// Таблица Tasks - задачи системы class Tasks extends Table { TextColumn get id => text().withDefault(const Constant('gen_random_uuid()'))(); TextColumn get name => text()(); IntColumn get minCycleMillis => integer()(); IntColumn get maxCycleMillis => integer()(); IntColumn get intervalMillis => integer()(); IntColumn get timeoutMillis => integer()(); TextColumn get status => text().nullable()(); TextColumn get description => text().nullable()(); DateTimeColumn get lastExecution => dateTime().nullable()(); // Audit DateTimeColumn get createdAt => dateTime().withDefault(currentTimestamp)(); DateTimeColumn get updatedAt => dateTime().withDefault(currentTimestamp)(); @override Set get primaryKey => {id}; } /// Таблица UserTasks - задачи пользователей class UserTasks extends Table { TextColumn get id => text().withDefault(const Constant('gen_random_uuid()'))(); TextColumn get title => text()(); TextColumn get description => text()(); TextColumn get type => text()(); // app_internal, external, social TextColumn get difficulty => text()(); // easy, medium, hard TextColumn get status => text()(); // available, in_progress, completed, expired, failed // Награды (JSON array) TextColumn get rewards => text() .withDefault(const Constant('[]')) .map(const JsonListConverter())(); DateTimeColumn get createdAt => dateTime().withDefault(currentTimestamp)(); DateTimeColumn get expiresAt => dateTime()(); DateTimeColumn get completedAt => dateTime().nullable()(); TextColumn get proofUrl => text().nullable()(); TextColumn get instructions => text().nullable()(); // Теги (JSON array) TextColumn get tags => text() .withDefault(const Constant('[]')) .map(const StringListConverter())(); TextColumn get imageUrl => text().nullable()(); // Audit DateTimeColumn get updatedAt => dateTime().withDefault(currentTimestamp)(); @override Set get primaryKey => {id}; } /// Таблица UserTaskProgresses - прогресс выполнения задач пользователями class UserTaskProgresses extends Table { TextColumn get id => text().withDefault(const Constant('gen_random_uuid()'))(); TextColumn get userId => text().references(Users, #id, onDelete: KeyAction.cascade)(); TextColumn get taskId => text()(); // Reference to UserTasks, but not FK to avoid circular deps // Прогресс (JSON) TextColumn get progress => text() .withDefault(const Constant('{}')) .map(const JsonMapConverter())(); DateTimeColumn get startedAt => dateTime().withDefault(currentTimestamp)(); DateTimeColumn get updatedAt => dateTime().withDefault(currentTimestamp)(); @override Set get primaryKey => {id}; } /// Таблица UserTaskResults - результаты выполнения задач class UserTaskResults extends Table { TextColumn get id => text().withDefault(const Constant('gen_random_uuid()'))(); TextColumn get userId => text().references(Users, #id, onDelete: KeyAction.cascade)(); TextColumn get taskId => text()(); // Reference to UserTasks // Результаты (JSON) TextColumn get results => text() .withDefault(const Constant('{}')) .map(const JsonMapConverter())(); DateTimeColumn get completedAt => dateTime().withDefault(currentTimestamp)(); // Audit DateTimeColumn get createdAt => dateTime().withDefault(currentTimestamp)(); @override Set get primaryKey => {id}; } // Конвертеры импортированы из converters.dart