import 'package:drift/drift.dart'; import 'package:drift_postgres/drift_postgres.dart'; import '../converters.dart' show generateUuid, StringListConverter, JsonListConverter; import 'users.dart'; /// Таблица DiscountCampaigns - кампании скидок class DiscountCampaigns extends Table { // ID как String, но фактически UUID (генерируется PostgreSQL на стороне БД) TextColumn get id => text().withDefault(const CustomExpression('gen_random_uuid()::text'))(); TextColumn get name => text().nullable()(); Column get start => customType(PgTypes.timestampWithTimezone)(); Column get finish => customType(PgTypes.timestampWithTimezone)(); // Статус (enum as string) TextColumn get status => text()(); // created, active, expired, disabled // Теги (JSON array) TextColumn get tags => text() .withDefault(const Constant('[]')) .map(const StringListConverter())(); // Audit Column get createdAt => customType(PgTypes.timestampWithTimezone).withDefault(now())(); Column get updatedAt => customType(PgTypes.timestampWithTimezone).withDefault(now())(); BoolColumn get isDeleted => boolean().customConstraint('NOT NULL DEFAULT FALSE')(); // PostgreSQL использует нативный BOOLEAN Column get deletedAt => customType(PgTypes.timestampWithTimezone).nullable()(); @override Set get primaryKey => {id}; } /// Таблица Discounts - скидки class Discounts extends Table { // ID как String, но фактически UUID (генерируется PostgreSQL на стороне БД) TextColumn get id => text().withDefault(const CustomExpression('gen_random_uuid()::text'))(); TextColumn get campaignId => text().references(DiscountCampaigns, #id, onDelete: KeyAction.cascade)(); // Процент скидки (0-100) RealColumn get discountPercent => real()(); // Продукты (JSON array) TextColumn get products => text().withDefault(const Constant('[]')).map(const JsonListConverter())(); // Audit Column get createdAt => customType(PgTypes.timestampWithTimezone).withDefault(now())(); Column get updatedAt => customType(PgTypes.timestampWithTimezone).withDefault(now())(); BoolColumn get isDeleted => boolean().customConstraint('NOT NULL DEFAULT FALSE')(); // PostgreSQL использует нативный BOOLEAN Column get deletedAt => customType(PgTypes.timestampWithTimezone).nullable()(); @override Set get primaryKey => {id}; } /// Junction table для связи Discounts ↔ UserDatas (many-to-many) class DiscountUserDatas extends Table { TextColumn get discountId => text().references(Discounts, #id, onDelete: KeyAction.cascade)(); TextColumn get userId => text().references(Users, #id, onDelete: KeyAction.cascade)(); Column get grantedAt => customType(PgTypes.timestampWithTimezone).withDefault(now())(); @override Set get primaryKey => {discountId, userId}; } // Конвертеры импортированы из converters.dart