import 'package:drift/drift.dart'; import 'package:drift_postgres/drift_postgres.dart'; import 'users.dart'; import '../converters.dart' show generateUuid; /// Таблица Tokens - токены авторизации пользователей class Tokens extends Table { // ID как String, но фактически UUID (генерируется PostgreSQL на стороне БД) TextColumn get id => text() .withDefault(const CustomExpression('gen_random_uuid()::text'))(); TextColumn get userId => text() .references(Users, #id, onDelete: KeyAction.cascade)(); TextColumn get token => text().unique()(); TextColumn get externalUserId => text()(); Column get created => customType(PgTypes.timestampWithTimezone) .withDefault(now())(); Column get expires => customType(PgTypes.timestampWithTimezone)(); BoolColumn get isDeleted => boolean() .customConstraint('NOT NULL DEFAULT FALSE')(); Column get deletedAt => customType(PgTypes.timestampWithTimezone) .nullable()(); @override Set get primaryKey => {id}; @override List get customConstraints => [ 'CONSTRAINT valid_expiry CHECK (expires > created)', ]; } /// Таблица RefreshTokens - refresh токены для JWT class RefreshTokens extends Table { // ID как String, но фактически UUID (генерируется PostgreSQL на стороне БД) TextColumn get id => text() .withDefault(const CustomExpression('gen_random_uuid()::text'))(); TextColumn get userId => text() .references(Users, #id, onDelete: KeyAction.cascade)(); TextColumn get jti => text().unique()(); // JWT ID BoolColumn get isBlacklisted => boolean() .customConstraint('NOT NULL DEFAULT FALSE')(); // PostgreSQL использует нативный BOOLEAN Column get createdAt => customType(PgTypes.timestampWithTimezone) .withDefault(now())(); Column get expiresAt => customType(PgTypes.timestampWithTimezone)(); BoolColumn get isDeleted => boolean() .customConstraint('NOT NULL DEFAULT FALSE')(); Column get deletedAt => customType(PgTypes.timestampWithTimezone) .nullable()(); @override Set get primaryKey => {id}; } /// Таблица TelegramAuthCodes - коды для авторизации через Telegram class TelegramAuthCodes extends Table { // ID как String, но фактически UUID (генерируется PostgreSQL на стороне БД) TextColumn get id => text() .withDefault(const CustomExpression('gen_random_uuid()::text'))(); TextColumn get code => text().unique()(); TextColumn get telegramUserId => text()(); TextColumn get telegramUsername => text().nullable()(); TextColumn get firstName => text().nullable()(); TextColumn get lastName => text().nullable()(); BoolColumn get isUsed => boolean() .withDefault(const Constant(false)) .customConstraint('')(); // PostgreSQL использует нативный BOOLEAN Column get usedAt => customType(PgTypes.timestampWithTimezone) .nullable()(); Column get createdAt => customType(PgTypes.timestampWithTimezone) .withDefault(now())(); Column get expiresAt => customType(PgTypes.timestampWithTimezone)(); BoolColumn get isDeleted => boolean() .customConstraint('NOT NULL DEFAULT FALSE')(); Column get deletedAt => customType(PgTypes.timestampWithTimezone) .nullable()(); @override Set get primaryKey => {id}; }