import 'package:drift/drift.dart'; import 'package:drift_flutter/drift_flutter.dart'; import 'package:path_provider/path_provider.dart'; part 'app_database.g.dart'; @DataClassName('ProductRow') class Products extends Table { TextColumn get id => text()(); TextColumn get name => text()(); TextColumn get category => text()(); IntColumn get stockQuantity => integer()(); IntColumn get lowStockThreshold => integer()(); IntColumn get priceInCents => integer()(); TextColumn get imagePath => text().nullable()(); BoolColumn get active => boolean().withDefault(const Constant(true))(); @override Set get primaryKey => {id}; } @DataClassName('BarTabRow') class BarTabs extends Table { TextColumn get id => text()(); TextColumn get customerName => text()(); TextColumn get status => text().withDefault(const Constant('open'))(); DateTimeColumn get openedAt => dateTime()(); DateTimeColumn get closedAt => dateTime().nullable()(); @override Set get primaryKey => {id}; } @DataClassName('TabItemRow') class TabItems extends Table { TextColumn get id => text()(); TextColumn get tabId => text().references(BarTabs, #id, onDelete: KeyAction.cascade)(); TextColumn get productId => text().references(Products, #id)(); TextColumn get productName => text()(); IntColumn get quantity => integer()(); IntColumn get unitPriceInCents => integer()(); DateTimeColumn get createdAt => dateTime()(); @override Set get primaryKey => {id}; } @DataClassName('ClosedTabsRow') class ClosedTabs extends Table { TextColumn get id => text()(); TextColumn get originalTabId => text()(); TextColumn get customerName => text()(); DateTimeColumn get closedAt => dateTime()(); TextColumn get paymentMethod => text().withDefault(const Constant('cash'))(); @override Set get primaryKey => {id}; } @DataClassName('ClosedTabItemRow') class ClosedTabItems extends Table { TextColumn get id => text()(); TextColumn get closedTabId => text()(); TextColumn get productId => text()(); TextColumn get productName => text()(); IntColumn get quantity => integer()(); IntColumn get unitPriceInCents => integer()(); @override Set get primaryKey => {id}; } @DataClassName('AppSettingsRow') class AppSettingsTable extends Table { @override String get tableName => 'app_settings'; TextColumn get id => text()(); BoolColumn get pinRequired => boolean().withDefault(const Constant(false))(); TextColumn get themeMode => text().withDefault(const Constant('system'))(); TextColumn get language => text().withDefault(const Constant('system'))(); IntColumn get barGridRows => integer().withDefault(const Constant(3))(); @override Set get primaryKey => {id}; } @DriftDatabase( tables: [ Products, BarTabs, TabItems, ClosedTabs, ClosedTabItems, AppSettingsTable, ], ) class AppDatabase extends _$AppDatabase { AppDatabase([QueryExecutor? executor]) : super(executor ?? _openConnection()); @override int get schemaVersion => 8; @override MigrationStrategy get migration { return MigrationStrategy( onCreate: (migrator) async { await migrator.createAll(); }, onUpgrade: (migrator, from, to) async { Future hasSettingsColumn(String columnName) async { final columns = await migrator.database .customSelect('PRAGMA table_info(app_settings)') .get(); return columns.any((column) => column.data['name'] == columnName); } if (from < 2) { await migrator.createTable(barTabs); await migrator.createTable(tabItems); } if (from < 3) { await migrator.addColumn(products, products.imagePath); } if (from < 4) { await migrator.createTable(closedTabs); await migrator.createTable(closedTabItems); } if (from < 5) { await migrator.createTable(appSettingsTable); } if (from < 6) { await migrator.addColumn(closedTabs, closedTabs.paymentMethod); } if (from < 7 && !await hasSettingsColumn('language')) { await migrator.addColumn(appSettingsTable, appSettingsTable.language); } if (from < 8 && !await hasSettingsColumn('bar_grid_rows')) { await migrator.addColumn( appSettingsTable, appSettingsTable.barGridRows, ); } }, ); } static QueryExecutor _openConnection() { return driftDatabase( name: 'kooltab', native: const DriftNativeOptions( databaseDirectory: getApplicationSupportDirectory, ), ); } }