Some checks are pending
Backend CI / test (push) Waiting to run
Backend CI / build (push) Blocked by required conditions
Deploy Mnemo Cards / Deploy Backend (push) Waiting to run
Deploy Mnemo Cards / Deploy Web App (push) Blocked by required conditions
Deploy Mnemo Cards / Final Verification (push) Blocked by required conditions
97 lines
4.1 KiB
Dart
97 lines
4.1 KiB
Dart
import 'package:drift/drift.dart';
|
|
import '../converters.dart' show generateUuid, IntListConverter, StringListConverter;
|
|
import '../postgres_constants.dart';
|
|
|
|
/// Таблица CardPacks - наборы карточек
|
|
class CardPacks extends Table {
|
|
TextColumn get id => text().withDefault(const Constant('gen_random_uuid()'))();
|
|
|
|
// Основная информация
|
|
TextColumn get title => text()();
|
|
TextColumn get subtitle => text()();
|
|
TextColumn get description => text().nullable()();
|
|
|
|
// Визуальное оформление
|
|
TextColumn get color => text().nullable()();
|
|
TextColumn get cover => text().nullable()(); // URL обложки
|
|
|
|
// Параметры
|
|
IntColumn get size => integer()(); // количество карточек
|
|
TextColumn get version => text().nullable()();
|
|
IntColumn get order => integer().withDefault(const Constant(0))();
|
|
BoolColumn get enabled => boolean()
|
|
.withDefault(const Constant(true))
|
|
.customConstraint('')(); // PostgreSQL использует нативный BOOLEAN, не нужен CHECK
|
|
|
|
// Порядок карточек (JSON array of IDs)
|
|
TextColumn get cardsOrder => text()
|
|
.withDefault(const Constant('[]'))
|
|
.map(const StringListConverter())();
|
|
|
|
// Store IDs для покупок
|
|
TextColumn get googlePlayId => text().nullable()();
|
|
TextColumn get rustoreId => text().nullable()();
|
|
TextColumn get appStoreId => text().nullable()();
|
|
|
|
// Цена
|
|
TextColumn get price => text().nullable()();
|
|
TextColumn get currency => text().withDefault(const Constant('RUB'))();
|
|
|
|
// Audit
|
|
DateTimeColumn get createdAt => dateTime().withDefault(currentTimestamp)();
|
|
DateTimeColumn get updatedAt => dateTime().withDefault(currentTimestamp)();
|
|
BoolColumn get isDeleted => boolean()
|
|
.withDefault(const Constant(false))
|
|
.customConstraint('')(); // PostgreSQL использует нативный BOOLEAN, не нужен CHECK
|
|
|
|
@override
|
|
Set<Column> get primaryKey => {id};
|
|
}
|
|
|
|
/// Таблица GameCards - карточки для изучения
|
|
class GameCards extends Table {
|
|
TextColumn get id => text().withDefault(const Constant('gen_random_uuid()'))();
|
|
TextColumn get packId => text().references(CardPacks, #id, onDelete: KeyAction.cascade)();
|
|
|
|
// Основной контент
|
|
TextColumn get original => text()(); // слово на иностранном языке
|
|
TextColumn get translation => text()(); // перевод
|
|
TextColumn get mnemo => text().nullable()(); // мнемоническая подсказка
|
|
|
|
// Изображения
|
|
TextColumn get image => text()(); // основное изображение
|
|
TextColumn get imageBack => text().nullable()(); // изображение на обратной стороне
|
|
|
|
// Произношение
|
|
TextColumn get transcription => text().nullable()();
|
|
TextColumn get transcriptionMnemo => text().nullable()();
|
|
|
|
// Дополнительная информация
|
|
TextColumn get back => text().nullable()(); // дополнительный текст
|
|
|
|
// Audit
|
|
DateTimeColumn get createdAt => dateTime().withDefault(currentTimestamp)();
|
|
DateTimeColumn get updatedAt => dateTime().withDefault(currentTimestamp)();
|
|
BoolColumn get isDeleted => boolean()
|
|
.withDefault(const Constant(false))
|
|
.customConstraint('')(); // PostgreSQL использует нативный BOOLEAN, не нужен CHECK
|
|
|
|
@override
|
|
Set<Column> get primaryKey => {id};
|
|
}
|
|
|
|
/// Таблица VoiceModels - голосовые файлы для карточек
|
|
class VoiceModels extends Table {
|
|
TextColumn get id => text().withDefault(const Constant('gen_random_uuid()'))();
|
|
TextColumn get cardId => text().references(GameCards, #id, onDelete: KeyAction.cascade)();
|
|
|
|
TextColumn get voiceUrl => text()(); // URL аудиофайла
|
|
TextColumn get language => text()(); // язык озвучки
|
|
|
|
DateTimeColumn get createdAt => dateTime().withDefault(currentTimestamp)();
|
|
|
|
@override
|
|
Set<Column> get primaryKey => {id};
|
|
}
|
|
|
|
// IntListConverter импортирован из converters.dart
|