import 'package:drift/drift.dart'; import 'package:drift_postgres/drift_postgres.dart'; import '../converters.dart'; /// Таблица Users - основная информация о пользователях class Users extends Table { // ID как String, но фактически UUID (генерируется PostgreSQL на стороне БД) TextColumn get id => text().withDefault(const CustomExpression('gen_random_uuid()::text'))(); TextColumn get externalUserId => text().unique()(); TextColumn get name => text().nullable()(); TextColumn get email => text().nullable()(); TextColumn get telegram => text().nullable()(); BoolColumn get admin => boolean().customConstraint( 'NOT NULL DEFAULT FALSE', )(); // PostgreSQL использует нативный BOOLEAN // UserSettings (JSON) TextColumn get userSettings => text().nullable()(); // Purchases (JSON array) TextColumn get purchases => text() .nullable() .withDefault(const Constant('[]')) .map(const StringListConverter())(); // Audit fields Column get createdAt => customType(PgTypes.timestampWithTimezone).withDefault(now())(); Column get updatedAt => customType(PgTypes.timestampWithTimezone).withDefault(now())(); BoolColumn get isDeleted => boolean().customConstraint( 'NOT NULL DEFAULT FALSE', )(); // PostgreSQL использует нативный BOOLEAN @override Set get primaryKey => {id}; } /// Таблица UserDatas - расширенная информация о пользователе class UserDatas extends Table { // ID как String, но фактически UUID (генерируется PostgreSQL на стороне БД) TextColumn get id => text().withDefault(const CustomExpression('gen_random_uuid()::text'))(); TextColumn get userId => text().unique().references(Users, #id, onDelete: KeyAction.cascade)(); // Статистика IntColumn get totalStudyTimeMinutes => integer().withDefault(const Constant(0))(); IntColumn get currentStreak => integer().withDefault(const Constant(0))(); IntColumn get longestStreak => integer().withDefault(const Constant(0))(); IntColumn get totalCards => integer().withDefault(const Constant(0))(); IntColumn get totalTests => integer().withDefault(const Constant(0))(); // Временные метки Column get lastTimeOnline => customType(PgTypes.timestampWithTimezone).nullable()(); Column get registrationDate => customType(PgTypes.timestampWithTimezone).withDefault(now())(); TextColumn get lastTestSessionToken => text().nullable()(); // Теги (JSON array) - небольшой размер, оставляем TextColumn get tags => text() .withDefault(const Constant('[]')) .map(const StringListConverter())(); // Audit Column get createdAt => customType(PgTypes.timestampWithTimezone).withDefault(now())(); Column get updatedAt => customType(PgTypes.timestampWithTimezone).withDefault(now())(); @override Set get primaryKey => {id}; } // Конвертеры импортированы из converters.dart