Skip to content

Commit a9a2acf

Browse files
committed
Change users to have multiple groups
1 parent 5a01915 commit a9a2acf

File tree

6 files changed

+65
-3
lines changed

6 files changed

+65
-3
lines changed

api/lib/models/user/database.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,10 @@ class UserDatabaseService extends UserService with TableService {
1010
UserDatabaseService();
1111

1212
@override
13-
Future<void> create(Database db) {
13+
Future<void> create(DatabaseExecutor db, [String name = 'users']) {
1414
return db.execute("""
15-
CREATE TABLE IF NOT EXISTS users (
15+
CREATE TABLE IF NOT EXISTS $name (
1616
id BLOB(16) PRIMARY KEY,
17-
groupId BLOB(16),
1817
name VARCHAR(100) NOT NULL DEFAULT '',
1918
email VARCHAR(100) NOT NULL DEFAULT '',
2019
description TEXT,

api/lib/models/user/group.dart

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import 'dart:typed_data';
2+
3+
import 'package:flow_api/models/user/model.dart';
4+
import 'package:flow_api/models/group/model.dart';
5+
import 'package:flow_api/services/database.dart';
6+
7+
class UserGroupDatabaseConnector extends DatabaseModelConnector<Group, User> {
8+
@override
9+
String get connectedIdName => "userId";
10+
11+
@override
12+
String get connectedTableName => "users";
13+
14+
@override
15+
String get tableName => "userGroups";
16+
17+
@override
18+
Future<List<User>> getConnected(Uint8List itemId,
19+
{int offset = 0, int limit = 50}) async {
20+
final result = await db?.query(
21+
'$tableName JOIN users ON userId = users.id',
22+
limit: limit,
23+
offset: offset,
24+
where: '$connectedIdName = ?',
25+
whereArgs: [itemId],
26+
);
27+
return result?.map((e) => User.fromDatabase(e)).toList() ?? [];
28+
}
29+
30+
@override
31+
Future<List<Group>> getItems(Uint8List connectId,
32+
{int offset = 0, int limit = 50}) async {
33+
final result = await db?.query(
34+
'$tableName JOIN groups ON groupId = groups.id',
35+
limit: limit,
36+
offset: offset,
37+
where: '$itemIdName = ?',
38+
whereArgs: [connectId],
39+
);
40+
return result?.map((e) => Group.fromDatabase(e)).toList() ?? [];
41+
}
42+
43+
@override
44+
String get itemIdName => 'groupId';
45+
46+
@override
47+
String get itemTableName => 'groups';
48+
}

api/lib/services/database.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import 'package:flow_api/models/resource/event.dart';
1515
import 'package:flow_api/models/resource/group.dart';
1616
import 'package:flow_api/models/resource/item.dart';
1717
import 'package:flow_api/models/resource/user.dart';
18+
import 'package:flow_api/models/user/group.dart';
1819
import 'package:flow_api/services/migration.dart';
1920
import 'package:flow_api/services/source.dart';
2021
import 'package:sqflite_common/sqlite_api.dart';
@@ -60,6 +61,8 @@ class DatabaseService extends SourceService {
6061
@override
6162
final UserDatabaseService user = UserDatabaseService();
6263
@override
64+
final UserGroupDatabaseConnector userGroup = UserGroupDatabaseConnector();
65+
@override
6366
final ResourceDatabaseService resource = ResourceDatabaseService();
6467
@override
6568
late final EventResourceDatabaseConnector eventResource =

api/lib/services/migration.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ Future<void> migrateDatabase(DatabaseService service, Database db,
2626
await service.groupResource.create(db);
2727
await service.eventResource.create(db);
2828
await service.calendarItemResource.create(db);
29+
await service.userGroup.create(db);
2930
await db.execute("ALTER TABLE places RENAME TO resources");
3031
await db.execute("PRAGMA foreign_keys=off");
3132
await db.transaction((txn) async {
@@ -51,6 +52,15 @@ Future<void> migrateDatabase(DatabaseService service, Database db,
5152
await txn
5253
.execute("ALTER TABLE calendarItems_temp RENAME TO calendarItems");
5354
});
55+
await db.transaction((txn) async {
56+
await service.user.create(txn, 'users_temp');
57+
await txn.execute(
58+
"INSERT INTO users_temp SELECT id, name, email, description, phone, image FROM users");
59+
await txn.execute(
60+
"INSERT INTO userGroups(userId, groupId) SELECT id, groupId FROM users");
61+
await txn.execute("DROP TABLE users");
62+
await txn.execute("ALTER TABLE users_temp RENAME TO users");
63+
});
5464
await db.execute("PRAGMA foreign_keys=on");
5565
}
5666
}

api/lib/services/source.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ abstract class SourceService {
3737
UserService? get user => null;
3838
LabelService? get label => null;
3939
ModelConnector<User, Event>? get eventUser => null;
40+
ModelConnector<Group, User>? get userGroup => null;
4041
ModelConnector<Group, Event>? get eventGroup => null;
4142
ModelConnector<User, CalendarItem>? get calendarItemUser => null;
4243
ModelConnector<Group, CalendarItem>? get calendarItemGroup => null;

metadata/en-US/changelogs/9.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
* Add event notes
33
* Add owner for notes
44
* Change events and calendar items to have multiple users and groups
5+
* Change users to have multiple groups
56
* Refactor places to resources
67
* Allow many-to-many relationship
78
* Add owner for resources

0 commit comments

Comments
 (0)