service: Hopefully guard against duplicate roster items in the database
This commit is contained in:
parent
255d0ef8ea
commit
7c6e3914ac
@ -34,6 +34,7 @@ class RosterService {
|
|||||||
/// and, if it was successful, create the database entry. Returns the
|
/// and, if it was successful, create the database entry. Returns the
|
||||||
/// [RosterItem] model object.
|
/// [RosterItem] model object.
|
||||||
Future<RosterItem> addToRosterWrapper(String avatarUrl, String jid, String title) async {
|
Future<RosterItem> addToRosterWrapper(String avatarUrl, String jid, String title) async {
|
||||||
|
final item = await GetIt.I.get<DatabaseService>().addRosterItemFromData(avatarUrl, jid, title);
|
||||||
final result = await GetIt.I.get<XmppConnection>().getRosterManager().addToRoster(jid, title);
|
final result = await GetIt.I.get<XmppConnection>().getRosterManager().addToRoster(jid, title);
|
||||||
if (!result) {
|
if (!result) {
|
||||||
// TODO: Signal error?
|
// TODO: Signal error?
|
||||||
@ -41,9 +42,6 @@ class RosterService {
|
|||||||
|
|
||||||
GetIt.I.get<XmppConnection>().getPresenceManager().sendSubscriptionRequest(jid);
|
GetIt.I.get<XmppConnection>().getPresenceManager().sendSubscriptionRequest(jid);
|
||||||
|
|
||||||
// TODO: Maybe guard against adding an item multiple times
|
|
||||||
final item = await GetIt.I.get<DatabaseService>().addRosterItemFromData(avatarUrl, jid, title);
|
|
||||||
|
|
||||||
sendData(RosterDiffEvent(newItems: [ item ]));
|
sendData(RosterDiffEvent(newItems: [ item ]));
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
@ -83,7 +81,6 @@ class RosterService {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Figure out if an item was removed
|
|
||||||
final newItems = List<RosterItem>.empty(growable: true);
|
final newItems = List<RosterItem>.empty(growable: true);
|
||||||
final removedItems = List<String>.empty(growable: true);
|
final removedItems = List<String>.empty(growable: true);
|
||||||
final modifiedItems = List<RosterItem>.empty(growable: true);
|
final modifiedItems = List<RosterItem>.empty(growable: true);
|
||||||
@ -99,6 +96,7 @@ class RosterService {
|
|||||||
await db.removeRosterItemByJid(item.jid);
|
await db.removeRosterItemByJid(item.jid);
|
||||||
removedItems.add(item.jid);
|
removedItems.add(item.jid);
|
||||||
|
|
||||||
|
if (await isInRoster(item.jid)) continue;
|
||||||
newItems.add(await db.addRosterItemFromData(
|
newItems.add(await db.addRosterItemFromData(
|
||||||
"",
|
"",
|
||||||
item.jid,
|
item.jid,
|
||||||
@ -110,6 +108,7 @@ class RosterService {
|
|||||||
// Handle deleted items
|
// Handle deleted items
|
||||||
for (final item in result.items) {
|
for (final item in result.items) {
|
||||||
if (!listContains(currentRoster, (RosterItem i) => i.jid == item.jid)) {
|
if (!listContains(currentRoster, (RosterItem i) => i.jid == item.jid)) {
|
||||||
|
if (await isInRoster(item.jid)) continue;
|
||||||
newItems.add(await db.addRosterItemFromData(
|
newItems.add(await db.addRosterItemFromData(
|
||||||
"",
|
"",
|
||||||
item.jid,
|
item.jid,
|
||||||
@ -153,17 +152,26 @@ class RosterService {
|
|||||||
title: item.name,
|
title: item.name,
|
||||||
groups: item.groups
|
groups: item.groups
|
||||||
);
|
);
|
||||||
|
|
||||||
|
sendData(RosterDiffEvent(
|
||||||
|
changedItems: [ modelRosterItem ]
|
||||||
|
));
|
||||||
} else {
|
} else {
|
||||||
|
if (await isInRoster(item.jid)) {
|
||||||
|
_log.info("Received roster push for ${item.jid} but this JID is already in the roster database. Ignoring...");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
modelRosterItem = await db.addRosterItemFromData(
|
modelRosterItem = await db.addRosterItemFromData(
|
||||||
"",
|
"",
|
||||||
item.jid,
|
item.jid,
|
||||||
item.jid.split("@")[0],
|
item.jid.split("@")[0],
|
||||||
groups: item.groups
|
groups: item.groups
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
sendData(RosterDiffEvent(
|
sendData(RosterDiffEvent(
|
||||||
changedItems: [ modelRosterItem ]
|
newItems: [ modelRosterItem ]
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user