Skip to content

Commit

Permalink
fixup! fixup! fixup! fixup! fixup! fixup! TW-2165: Improve get/store …
Browse files Browse the repository at this point in the history
…Participants
  • Loading branch information
nqhhdev committed Dec 29, 2024
1 parent 14fd0ce commit cb37032
Show file tree
Hide file tree
Showing 6 changed files with 203 additions and 21 deletions.
2 changes: 1 addition & 1 deletion lib/src/database/database_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ abstract class DatabaseApi {

Future<List<User>> getUsers(Room room);

Future<void> storeUsers(List<User> users, Room room);
Future<void> storeUser(User user, Room room);

Future<List<Event>> getEventList(
Room room, {
Expand Down
8 changes: 3 additions & 5 deletions lib/src/database/hive_collections_database.dart
Original file line number Diff line number Diff line change
Expand Up @@ -813,11 +813,9 @@ class HiveCollectionsDatabase extends DatabaseApi {
}

@override
Future<void> storeUsers(List<User> users, Room room) async {
for (final user in users) {
final key = TupleKey(room.id, user.id).toString();
await _roomMembersBox.put(key, user.toJson());
}
Future<void> storeUser(User user, Room room) async {
final key = TupleKey(room.id, user.id).toString();
await _roomMembersBox.put(key, user.toJson());
return;
}

Expand Down
8 changes: 3 additions & 5 deletions lib/src/database/hive_database.dart
Original file line number Diff line number Diff line change
Expand Up @@ -746,11 +746,9 @@ class FamedlySdkHiveDatabase extends DatabaseApi {
}

@override
Future<void> storeUsers(List<User> users, Room room) async {
for (final user in users) {
final key = MultiKey(room.id, user.id).toString();
await _roomMembersBox.put(key, user.toJson());
}
Future<void> storeUser(User user, Room room) async {
final key = MultiKey(room.id, user.id).toString();
await _roomMembersBox.put(key, user.toJson());
return Future.value();
}

Expand Down
22 changes: 21 additions & 1 deletion lib/src/room.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1427,15 +1427,35 @@ class Room {
if (cache) {
for (final user in users) {
setState(user);
await handleStoreUserInDatabase(user);
}
await client.database?.storeUsers(users, this);
}

_requestedParticipants = cache;
users.removeWhere((u) => !membershipFilter.contains(u.membership));
return users;
}

Future<void> handleStoreUserInDatabase(User user) async {
try {
final userExists = await client.database?.getUser(user.id, this);
if (userExists != null) {
Logs().w(
'Room::_handleStoreUserInDatabase: User ${user.id} already exists in the database',
);
return;
}
await client.database?.storeUser(user, this);
} catch (e) {
Logs().e(
'Room::_handleStoreUserInDatabase: $e',
);
Logs().e(
'Room::_handleStoreUserInDatabase: Failed to store users in the database',
);
}
}

/// Checks if the local participant list of joined and invited users is complete.
bool get participantListComplete {
final knownParticipants = getParticipants();
Expand Down
16 changes: 7 additions & 9 deletions test/database_api_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -233,15 +233,13 @@ void testDatabase(
test('storeUsers', () async {
final room =
Room(id: '!testroom:example.com', client: Client('testclient'));
await database.storeUsers(
[
User(
'@bob:example.org',
displayName: 'Bob',
avatarUrl: 'mxc://example.com',
room: room,
)
],
await database.storeUser(
User(
'@bob:example.org',
displayName: 'Bob',
avatarUrl: 'mxc://example.com',
room: room,
),
Room(id: '!testroom:example.com', client: Client('testclient')),
);
final users = await database.getUsers(
Expand Down
168 changes: 168 additions & 0 deletions test/store_user_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
import 'package:matrix/matrix.dart';
import 'package:test/test.dart';

import 'fake_client.dart';

void main() {
late Client client;
late Room room;
group('Store user to Database test\n', () {
setUp(() async {
client = await getClient();
final heroes = [
'@alice:matrix.org',
'@bob:example.com',
'@charley:example.org'
];
final id = '!localpart:server.abc';
final membership = Membership.join;
room = Room(
client: client,
id: id,
membership: membership,
prev_batch: '',
summary: RoomSummary.fromJson({
'm.joined_member_count': 2,
'm.invited_member_count': 2,
'm.heroes': heroes,
}),
roomAccountData: {
'com.test.foo': BasicRoomEvent(
type: 'com.test.foo',
content: {'foo': 'bar'},
),
'm.fully_read': BasicRoomEvent(
type: 'm.fully_read',
content: {'event_id': '\$event_id:example.com'},
),
},
);
});

test(
'GIVE a user from server\n'
'ADD add user to database\n'
'THEN user added\n', () async {
final userServer = User(
'@bob:example.org',
displayName: 'Bob',
avatarUrl: 'mxc://example.com',
room: room,
);

await room.handleStoreUserInDatabase(userServer);

final userDataBase = await client.database?.getUser(userServer.id, room);

expect(userDataBase != null, true);

expect(userDataBase?.id, userServer.id);
});

test(
'GIVE users from server\n'
'ADD add users to database\n'
'THEN users added\n', () async {
final usersServer = [
User(
'@bob:example.org',
displayName: 'Bob',
avatarUrl: 'mxc://example.com',
room: room,
),
User(
'@bob2:example.org',
displayName: 'Bob_2',
avatarUrl: 'mxc://example.com',
room: room,
),
User(
'@bob3:example.org',
displayName: 'Bob_3',
avatarUrl: 'mxc://example.com',
room: room,
),
];

final getUsersInitial = await client.database?.getUsers(room);

expect(getUsersInitial?.isEmpty, true);

for (final user in usersServer) {
await room.handleStoreUserInDatabase(user);
}

final users = await client.database?.getUsers(room);

expect(users?.length, 3);
});

test(
'GIVE users (Bob, Bob_2, Bob_3) from server\n'
'ADD add users to database\n'
'AND add same users (Bob, Bob_2, Bob_3) again\n'
'THEN users (Bob, Bob_2, Bob_3) added\n', () async {
final usersServer = [
User(
'@bob:example.org',
displayName: 'Bob',
avatarUrl: 'mxc://example.com',
room: room,
),
User(
'@bob2:example.org',
displayName: 'Bob_2',
avatarUrl: 'mxc://example.com',
room: room,
),
User(
'@bob3:example.org',
displayName: 'Bob_3',
avatarUrl: 'mxc://example.com',
room: room,
),
];

final getUsersInitial = await client.database?.getUsers(room);

expect(getUsersInitial?.isEmpty, true);

for (final user in usersServer) {
await room.handleStoreUserInDatabase(user);
}

final usersAddFirstTime = await client.database?.getUsers(room);

expect(usersAddFirstTime?.length, 3);

for (final user in usersServer) {
await room.handleStoreUserInDatabase(user);
}

final usersAddSecondTime = await client.database?.getUsers(room);

expect(usersAddSecondTime?.length, 3);

expect(
usersAddSecondTime
?.where((user) => user.stateKey == '@bob:example.org')
.isNotEmpty,
true,
);

expect(
usersAddSecondTime
?.where((user) => user.stateKey == '@bob2:example.org')
.isNotEmpty,
true,
);

expect(
usersAddSecondTime
?.where((user) => user.stateKey == '@bob3:example.org')
.isNotEmpty,
true,
);
});
});
}

0 comments on commit cb37032

Please sign in to comment.