mnemo_cards/mnemo_cards_backend/lib/database/tables/users.dart

98 lines
3.8 KiB
Dart
Raw Normal View History

2025-12-13 13:27:05 +00:00
import 'package:drift/drift.dart';
2025-12-13 23:35:14 +00:00
import 'package:drift_postgres/drift_postgres.dart';
2025-12-13 13:27:05 +00:00
import '../converters.dart';
/// Таблица Users - основная информация о пользователях
class Users extends Table {
2025-12-13 23:35:14 +00:00
// ID как String, но фактически UUID (генерируется PostgreSQL на стороне БД)
TextColumn get id => text()
.withDefault(const CustomExpression('gen_random_uuid()::text'))();
2025-12-13 13:27:05 +00:00
TextColumn get externalUserId => text().unique()();
TextColumn get name => text().nullable()();
TextColumn get email => text().nullable()();
2025-12-13 22:00:36 +00:00
BoolColumn get admin => boolean()
.withDefault(const Constant(false))
2025-12-13 23:35:14 +00:00
.customConstraint('')(); // PostgreSQL использует нативный BOOLEAN
2025-12-13 13:27:05 +00:00
// UserSettings (JSON)
TextColumn get userSettings => text().nullable()();
// Purchases (JSON array)
TextColumn get purchases => text()
2025-12-14 00:25:54 +00:00
.nullable()
2025-12-13 13:27:05 +00:00
.withDefault(const Constant('[]'))
.map(const StringListConverter())();
// Audit fields
2025-12-13 23:35:14 +00:00
Column<PgDateTime> get createdAt => customType(PgTypes.timestampWithTimezone)
.withDefault(now())();
Column<PgDateTime> get updatedAt => customType(PgTypes.timestampWithTimezone)
.withDefault(now())();
2025-12-13 22:00:36 +00:00
BoolColumn get isDeleted => boolean()
.withDefault(const Constant(false))
2025-12-13 23:35:14 +00:00
.customConstraint('')(); // PostgreSQL использует нативный BOOLEAN
2025-12-13 13:27:05 +00:00
2025-12-13 20:55:50 +00:00
@override
Set<Column> get primaryKey => {id};
2025-12-13 13:27:05 +00:00
}
/// Таблица UserDatas - расширенная информация о пользователе
class UserDatas extends Table {
2025-12-13 23:35:14 +00:00
// 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)();
2025-12-13 13:27:05 +00:00
// Статистика
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))();
// Временные метки
2025-12-13 23:35:14 +00:00
Column<PgDateTime> get lastTimeOnline => customType(PgTypes.timestampWithTimezone)
.nullable()();
Column<PgDateTime> get registrationDate => customType(PgTypes.timestampWithTimezone)
.withDefault(now())();
2025-12-13 13:27:05 +00:00
TextColumn get lastTestSessionToken => text().nullable()();
// Сложные структуры (JSON)
TextColumn get words => text()
.withDefault(const Constant('[]'))
.map(const JsonListConverter())();
TextColumn get tags => text()
.withDefault(const Constant('[]'))
.map(const StringListConverter())();
TextColumn get packProgress => text()
.withDefault(const Constant('[]'))
.map(const JsonListConverter())();
TextColumn get studyDates => text()
.withDefault(const Constant('[]'))
.map(const DateTimeListConverter())();
TextColumn get achievements => text()
.withDefault(const Constant('[]'))
.map(const JsonListConverter())();
TextColumn get categoryMinutes => text()
.withDefault(const Constant('{}'))
.map(const JsonMapConverter())();
// Audit
2025-12-13 23:35:14 +00:00
Column<PgDateTime> get createdAt => customType(PgTypes.timestampWithTimezone)
.withDefault(now())();
Column<PgDateTime> get updatedAt => customType(PgTypes.timestampWithTimezone)
.withDefault(now())();
2025-12-13 20:55:50 +00:00
@override
Set<Column> get primaryKey => {id};
2025-12-13 13:27:05 +00:00
}
// Конвертеры импортированы из converters.dart