fix: Use both userId and id as primarykeys add first migration

This commit is contained in:
PartyDonut 2025-07-31 20:35:44 +02:00
parent 83c38d4042
commit 0f6d24dc5a
2 changed files with 42 additions and 13 deletions

View file

@ -17,9 +17,9 @@ import 'package:fladder/providers/user_provider.dart';
part 'database_item.g.dart'; part 'database_item.g.dart';
@TableIndex(name: 'database_id', columns: {#id}) @TableIndex(name: 'database_id', columns: {#userId, #id})
class DatabaseItems extends Table { class DatabaseItems extends Table {
TextColumn get userId => text()(); TextColumn get userId => text().withLength(min: 1)();
TextColumn get id => text().withLength(min: 1)(); TextColumn get id => text().withLength(min: 1)();
BoolColumn get syncing => boolean()(); BoolColumn get syncing => boolean()();
TextColumn get sortName => text().nullable()(); TextColumn get sortName => text().nullable()();
@ -35,7 +35,7 @@ class DatabaseItems extends Table {
TextColumn get userData => text().nullable()(); TextColumn get userData => text().nullable()();
@override @override
Set<Column<Object>> get primaryKey => {id, userId}; Set<Column<Object>> get primaryKey => {userId, id};
} }
@DriftDatabase(tables: [DatabaseItems]) @DriftDatabase(tables: [DatabaseItems])
@ -47,7 +47,7 @@ class AppDatabase extends _$AppDatabase {
String get userId => ref.read(userProvider.select((value) => value?.id ?? "")); String get userId => ref.read(userProvider.select((value) => value?.id ?? ""));
@override @override
int get schemaVersion => 1; int get schemaVersion => 2;
Future<void> clearDatabase() { Future<void> clearDatabase() {
return transaction(() async { return transaction(() async {
@ -129,9 +129,11 @@ class AppDatabase extends _$AppDatabase {
}); });
} }
Future<void> deleteAllItems(List<SyncedItem> items) async => await batch((batch) { Future<void> deleteAllItems(List<SyncedItem> items) async {
batch.deleteWhere(databaseItems, (tbl) => tbl.id.isIn(items.map((e) => e.id))); await batch((batch) {
}); batch.deleteWhere(databaseItems, (tbl) => tbl.id.isIn(items.map((e) => e.id)) & tbl.userId.equals(userId));
});
}
DatabaseItemsCompanion toDataBaseItem(SyncedItem item) { DatabaseItemsCompanion toDataBaseItem(SyncedItem item) {
return DatabaseItemsCompanion( return DatabaseItemsCompanion(
@ -190,4 +192,27 @@ class AppDatabase extends _$AppDatabase {
// If you need web support, see https://drift.simonbinder.eu/platforms/web/ // If you need web support, see https://drift.simonbinder.eu/platforms/web/
); );
} }
@override
MigrationStrategy get migration {
return MigrationStrategy(
onCreate: (Migrator m) {
return m.createAll();
},
onUpgrade: (Migrator m, int from, int to) async {
if (from == 1) {
final allItems = await select(databaseItems).get();
m.deleteTable(databaseItems.actualTableName);
m.createAll();
await batch((batch) {
batch.insertAll(
databaseItems,
allItems,
mode: InsertMode.insertOrReplace,
);
});
}
},
);
}
} }

View file

@ -11,9 +11,13 @@ class $DatabaseItemsTable extends DatabaseItems
$DatabaseItemsTable(this.attachedDatabase, [this._alias]); $DatabaseItemsTable(this.attachedDatabase, [this._alias]);
static const VerificationMeta _userIdMeta = const VerificationMeta('userId'); static const VerificationMeta _userIdMeta = const VerificationMeta('userId');
@override @override
late final GeneratedColumn<String> userId = GeneratedColumn<String>( late final GeneratedColumn<String> userId =
'user_id', aliasedName, false, GeneratedColumn<String>('user_id', aliasedName, false,
type: DriftSqlType.string, requiredDuringInsert: true); additionalChecks: GeneratedColumn.checkTextLength(
minTextLength: 1,
),
type: DriftSqlType.string,
requiredDuringInsert: true);
static const VerificationMeta _idMeta = const VerificationMeta('id'); static const VerificationMeta _idMeta = const VerificationMeta('id');
@override @override
late final GeneratedColumn<String> id = late final GeneratedColumn<String> id =
@ -194,7 +198,7 @@ class $DatabaseItemsTable extends DatabaseItems
} }
@override @override
Set<GeneratedColumn> get $primaryKey => {id, userId}; Set<GeneratedColumn> get $primaryKey => {userId, id};
@override @override
DatabaseItem map(Map<String, dynamic> data, {String? tablePrefix}) { DatabaseItem map(Map<String, dynamic> data, {String? tablePrefix}) {
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
@ -704,8 +708,8 @@ abstract class _$AppDatabase extends GeneratedDatabase {
_$AppDatabase(QueryExecutor e) : super(e); _$AppDatabase(QueryExecutor e) : super(e);
$AppDatabaseManager get managers => $AppDatabaseManager(this); $AppDatabaseManager get managers => $AppDatabaseManager(this);
late final $DatabaseItemsTable databaseItems = $DatabaseItemsTable(this); late final $DatabaseItemsTable databaseItems = $DatabaseItemsTable(this);
late final Index databaseId = late final Index databaseId = Index('database_id',
Index('database_id', 'CREATE INDEX database_id ON database_items (id)'); 'CREATE INDEX database_id ON database_items (user_id, id)');
@override @override
Iterable<TableInfo<Table, Object?>> get allTables => Iterable<TableInfo<Table, Object?>> get allTables =>
allSchemaEntities.whereType<TableInfo<Table, Object?>>(); allSchemaEntities.whereType<TableInfo<Table, Object?>>();