import 'package:drift/drift.dart'; import '../converters.dart' show generateUuid, JsonMapConverter; import '../postgres_constants.dart'; import 'packs.dart'; /// Таблица Tests - тесты class Tests extends Table { TextColumn get id => text().withDefault(const Constant('gen_random_uuid()'))(); TextColumn get name => text()(); TextColumn get color => text().nullable()(); TextColumn get cover => text().nullable()(); TextColumn get version => text().nullable()(); TextColumn get time => text().nullable()(); TextColumn get timeSubtitle => text().nullable()(); // Audit DateTimeColumn get createdAt => dateTime().withDefault(currentTimestamp)(); DateTimeColumn get updatedAt => dateTime().withDefault(currentTimestamp)(); BoolColumn get isDeleted => boolean().withDefault(const Constant(false))(); @override Set get primaryKey => {id}; } /// Таблица TestQuestions - вопросы тестов class TestQuestions extends Table { TextColumn get id => text().withDefault(const Constant('gen_random_uuid()'))(); TextColumn get testId => text().references(Tests, #id, onDelete: KeyAction.cascade)(); // Тип вопроса (enum as string) TextColumn get questionType => text()(); TextColumn get body => text()(); // Audit DateTimeColumn get createdAt => dateTime().withDefault(currentTimestamp)(); DateTimeColumn get updatedAt => dateTime().withDefault(currentTimestamp)(); @override Set get primaryKey => {id}; } /// Таблица TestPackRelations - связь Tests с CardPacks (many-to-many) class TestPackRelations extends Table { TextColumn get testId => text().references(Tests, #id, onDelete: KeyAction.cascade)(); TextColumn get packId => text().references(CardPacks, #id, onDelete: KeyAction.cascade)(); @override Set get primaryKey => {testId, packId}; } /// Таблица TestStatistics - статистика прохождения тестов class TestStatistics extends Table { TextColumn get id => text().withDefault(const Constant('gen_random_uuid()'))(); TextColumn get userId => text()(); // Reference to Users, but not FK to avoid circular deps TextColumn get testId => text().references(Tests, #id, onDelete: KeyAction.cascade)(); // Результаты (JSON) TextColumn get results => text() .withDefault(const Constant('{}')) .map(const JsonMapConverter())(); DateTimeColumn get completedAt => dateTime().withDefault(currentTimestamp)(); // Audit DateTimeColumn get createdAt => dateTime().withDefault(currentTimestamp)(); DateTimeColumn get updatedAt => dateTime().withDefault(currentTimestamp)(); @override Set get primaryKey => {id}; } // Конвертеры импортированы из converters.dart