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

112 lines
4.5 KiB
Dart
Raw Permalink 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-20 18:26:15 +00:00
import '../converters.dart'
show generateUuid, IntListConverter, StringListConverter;
2025-12-13 13:27:05 +00:00
/// Таблица CardPacks - наборы карточек
class CardPacks extends Table {
2025-12-13 23:35:14 +00:00
// ID как String, но фактически UUID (генерируется PostgreSQL на стороне БД)
2025-12-20 18:26:15 +00:00
TextColumn get id =>
text().withDefault(const CustomExpression('gen_random_uuid()::text'))();
2025-12-13 13:27:05 +00:00
// Основная информация
TextColumn get title => text()();
TextColumn get subtitle => text()();
TextColumn get description => text().nullable()();
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
// Визуальное оформление
TextColumn get color => text().nullable()();
2025-12-20 18:26:15 +00:00
TextColumn get cover => text().nullable()(); // URL обложки
2025-12-13 13:27:05 +00:00
// Параметры
2025-12-20 18:26:15 +00:00
IntColumn get size => integer()(); // количество карточек
2025-12-13 13:27:05 +00:00
TextColumn get version => text().nullable()();
IntColumn get order => integer().withDefault(const Constant(0))();
2025-12-20 18:26:15 +00:00
BoolColumn get enabled =>
boolean().customConstraint('NOT NULL DEFAULT TRUE')();
// PostgreSQL использует нативный BOOLEAN
2025-12-13 13:27:05 +00:00
// Порядок карточек (JSON array of IDs)
TextColumn get cardsOrder => text()
.withDefault(const Constant('[]'))
2025-12-13 20:55:50 +00:00
.map(const StringListConverter())();
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
// Store IDs для покупок
TextColumn get googlePlayId => text().nullable()();
TextColumn get rustoreId => text().nullable()();
TextColumn get appStoreId => text().nullable()();
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
// Цена
TextColumn get price => text().nullable()();
TextColumn get currency => text().withDefault(const Constant('RUB'))();
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
// Audit
2025-12-20 18:26:15 +00:00
Column<PgDateTime> get createdAt =>
customType(PgTypes.timestampWithTimezone).withDefault(now())();
Column<PgDateTime> get updatedAt =>
customType(PgTypes.timestampWithTimezone).withDefault(now())();
BoolColumn get isDeleted =>
boolean().customConstraint('NOT NULL DEFAULT FALSE')();
// PostgreSQL использует нативный BOOLEAN
2025-12-13 20:55:50 +00:00
@override
Set<Column> get primaryKey => {id};
2025-12-13 13:27:05 +00:00
}
/// Таблица GameCards - карточки для изучения
class GameCards extends Table {
2025-12-13 23:35:14 +00:00
// ID как String, но фактически UUID (генерируется PostgreSQL на стороне БД)
2025-12-20 18:26:15 +00:00
TextColumn get id =>
text().withDefault(const CustomExpression('gen_random_uuid()::text'))();
2025-12-14 20:36:05 +00:00
// packId удален - связь теперь только через CardPackCards (many-to-many)
2025-12-13 13:27:05 +00:00
// Основной контент
2025-12-20 18:26:15 +00:00
TextColumn get original => text()(); // слово на иностранном языке
TextColumn get translation => text()(); // перевод
TextColumn get mnemo => text().nullable()(); // мнемоническая подсказка
2025-12-13 13:27:05 +00:00
// Изображения
2025-12-20 18:26:15 +00:00
TextColumn get image => text()(); // основное изображение
TextColumn get imageBack =>
text().nullable()(); // изображение на обратной стороне
2025-12-13 13:27:05 +00:00
// Произношение
TextColumn get transcription => text().nullable()();
TextColumn get transcriptionMnemo => text().nullable()();
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
// Дополнительная информация
2025-12-20 18:26:15 +00:00
TextColumn get back => text().nullable()(); // дополнительный текст
2025-12-13 13:27:05 +00:00
// Audit
2025-12-20 18:26:15 +00:00
Column<PgDateTime> get createdAt =>
customType(PgTypes.timestampWithTimezone).withDefault(now())();
Column<PgDateTime> get updatedAt =>
customType(PgTypes.timestampWithTimezone).withDefault(now())();
BoolColumn get isDeleted =>
boolean().customConstraint('NOT NULL DEFAULT FALSE')();
// PostgreSQL использует нативный BOOLEAN
2025-12-13 20:55:50 +00:00
@override
Set<Column> get primaryKey => {id};
2025-12-13 13:27:05 +00:00
}
/// Таблица VoiceModels - голосовые файлы для карточек
class VoiceModels extends Table {
2025-12-13 23:35:14 +00:00
// ID как String, но фактически UUID (генерируется PostgreSQL на стороне БД)
2025-12-20 18:26:15 +00:00
TextColumn get id =>
text().withDefault(const CustomExpression('gen_random_uuid()::text'))();
TextColumn get cardId =>
text().references(GameCards, #id, onDelete: KeyAction.cascade)();
TextColumn get voiceUrl => text()(); // URL аудиофайла
TextColumn get language => text()(); // язык озвучки
2025-12-13 13:27:05 +00:00
2025-12-20 18:26:15 +00:00
Column<PgDateTime> get createdAt =>
customType(PgTypes.timestampWithTimezone).withDefault(now())();
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
}
// IntListConverter импортирован из converters.dart