import 'package:drift/drift.dart'; import 'package:drift_postgres/drift_postgres.dart'; import '../converters.dart' show generateUuid, JsonListConverter, StringListConverter; import 'users.dart'; /// Таблица PromoCodesCampaigns - кампании промокодов class PromoCodesCampaigns extends Table { // ID как String, но фактически UUID (генерируется PostgreSQL на стороне БД) TextColumn get id => text() .withDefault(const CustomExpression('gen_random_uuid()::text'))(); TextColumn get template => text()(); TextColumn get name => text().nullable()(); // Продукты (JSON array) TextColumn get products => text() .withDefault(const Constant('[]')) .map(const JsonListConverter())(); IntColumn get activationsPerCode => integer()(); IntColumn get activationsPerUser => integer()(); IntColumn get generationSize => integer()(); Column get start => customType(PgTypes.timestampWithTimezone)(); Column get finish => customType(PgTypes.timestampWithTimezone)(); // Статус (enum as string) TextColumn get status => text()(); // created, preparing, ready, active, 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() .withDefault(const Constant(false))(); // PostgreSQL использует нативный BOOLEAN Column get deletedAt => customType(PgTypes.timestampWithTimezone) .nullable()(); @override Set get primaryKey => {id}; } /// Таблица PromoCodes - промокоды class PromoCodes extends Table { // ID как String, но фактически UUID (генерируется PostgreSQL на стороне БД) TextColumn get id => text() .withDefault(const CustomExpression('gen_random_uuid()::text'))(); TextColumn get campaignId => text() .references(PromoCodesCampaigns, #id, onDelete: KeyAction.cascade)(); TextColumn get code => text().unique()(); IntColumn get activations => integer().withDefault(const Constant(0))(); // Индивидуальный промокод (связан с пользователем) TextColumn get userId => text() .nullable() .references(Users, #id, onDelete: KeyAction.cascade)(); // Audit Column get createdAt => customType(PgTypes.timestampWithTimezone) .withDefault(now())(); Column get updatedAt => customType(PgTypes.timestampWithTimezone) .withDefault(now())(); BoolColumn get isDeleted => boolean() .withDefault(const Constant(false))(); Column get deletedAt => customType(PgTypes.timestampWithTimezone) .nullable()(); @override Set get primaryKey => {id}; } // Конвертеры импортированы из converters.dart