brick
brick copied to clipboard
Upsert hang forever when having Many-to-Many relationship between models
I have a many-to-many models like:
// Model A
@ConnectOfflineFirstWithSupabase(
supabaseConfig: SupabaseSerializable(tableName: "groups"),
)
class Group extends OfflineFirstWithSupabaseModel {
@Supabase(unique: true)
@Sqlite(index: true, unique: true)
final String id;
[...]
}
// Model B
@ConnectOfflineFirstWithSupabase(
supabaseConfig: SupabaseSerializable(tableName: "persons")
)
class Person extends OfflineFirstWithSupabaseModel {
@Supabase(unique: true)
@Sqlite(index: true, unique: true)
final String id;
[...]
}
// Join model
@ConnectOfflineFirstWithSupabase(
supabaseConfig: SupabaseSerializable(tableName: "_group_persons_"),
)
class GroupPersons extends OfflineFirstWithSupabaseModel {
@Supabase(unique: true)
@Sqlite(index: true, unique: true)
final String id;
//
@Supabase(foreignKey: "group_id", ignoreTo: true)
@Sqlite(index: true)
final Group group;
@Sqlite(ignore: true)
String get groupId => group.id;
@Supabase(foreignKey: "person_id", ignoreTo: true)
@Sqlite(index: true)
final Person person;
@Sqlite(ignore: true)
String get personId => person.id;
///
GroupPersons({
String? id,
required this.group,
required this.person,
}) :
id = id ?? const Uuid().v7();
[...]
}
When I upsert like:
static Future<Group> createWithMembers({required User creator, required List<Person> members, String? name}) async {
// Construct a group
final tempGroup = Group(creatorId: creator.localId, name: name, memberLinks: []);
// Create memberLinks now linking to this group
final memberLinks = members.map((p) => GroupPersons(group: tempGroup, person: p)).toList();
// Assign memberLinks to group
final toGroup = tempGroup.copyWith(memberLinks: memberLinks);
//
return appDB.upsert<Group>(toGroup);
}
The operation is hanging forever. Am I doing it wrong? How do you handle creation in Many-to-Many relationship then?