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

86 lines
3.2 KiB
Dart
Raw Normal View History

2025-12-13 13:27:05 +00:00
import 'package:drift/drift.dart';
import '../converters.dart';
2025-12-13 21:40:59 +00:00
import '../postgres_constants.dart';
2025-12-13 13:27:05 +00:00
/// Таблица Users - основная информация о пользователях
class Users extends Table {
2025-12-13 20:55:50 +00:00
TextColumn get id => text().withDefault(const Constant('gen_random_uuid()'))();
2025-12-13 13:27:05 +00:00
TextColumn get externalUserId => text().unique()();
TextColumn get name => text().nullable()();
TextColumn get email => text().nullable()();
BoolColumn get admin => boolean().withDefault(const Constant(false))();
// UserSettings (JSON)
TextColumn get userSettings => text().nullable()();
// Purchases (JSON array)
TextColumn get purchases => text()
.withDefault(const Constant('[]'))
.map(const StringListConverter())();
// Audit fields
2025-12-13 21:40:59 +00:00
DateTimeColumn get createdAt => dateTime().withDefault(currentTimestamp)();
DateTimeColumn get updatedAt => dateTime().withDefault(currentTimestamp)();
2025-12-13 13:27:05 +00:00
BoolColumn get isDeleted => boolean().withDefault(const Constant(false))();
2025-12-13 20:55:50 +00:00
@override
Set<Column> get primaryKey => {id};
2025-12-13 13:27:05 +00:00
@override
List<String> get customConstraints => [
'CONSTRAINT valid_email CHECK (email IS NULL OR email LIKE \'%@%\')',
];
}
/// Таблица UserDatas - расширенная информация о пользователе
class UserDatas extends Table {
2025-12-13 20:55:50 +00:00
TextColumn get id => text().withDefault(const Constant('gen_random_uuid()'))();
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))();
// Временные метки
DateTimeColumn get lastTimeOnline => dateTime().nullable()();
2025-12-13 21:40:59 +00:00
DateTimeColumn get registrationDate => dateTime().withDefault(currentTimestamp)();
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 21:40:59 +00:00
DateTimeColumn get createdAt => dateTime().withDefault(currentTimestamp)();
DateTimeColumn get updatedAt => dateTime().withDefault(currentTimestamp)();
2025-12-13 20:55:50 +00:00
@override
Set<Column> get primaryKey => {id};
2025-12-13 13:27:05 +00:00
}
// Конвертеры импортированы из converters.dart