diff --git a/synapse/storage/roommember.py b/synapse/storage/roommember.py
index abe5942744..36456a75fc 100644
--- a/synapse/storage/roommember.py
+++ b/synapse/storage/roommember.py
@@ -66,11 +66,15 @@ class RoomMemberStore(SQLBaseStore):
self.get_invited_rooms_for_user.invalidate, (event.state_key,)
)
- is_mine = self.hs.is_mine_id(event.state_key)
+ # We update the local_invites table only if the event is "current",
+ # i.e., its something that has just happened.
+ # The only current event that can also be an outlier is if its an
+ # invite that has come in across federation.
is_new_state = not backfilled and (
not event.internal_metadata.is_outlier()
or event.internal_metadata.is_invite_from_remote()
)
+ is_mine = self.hs.is_mine_id(event.state_key)
if is_new_state and is_mine:
if event.membership == Membership.INVITE:
self._simple_insert_txn(
@@ -163,7 +167,17 @@ class RoomMemberStore(SQLBaseStore):
)
@defer.inlineCallbacks
- def get_inviter(self, user_id, room_id):
+ def get_invite_for_user_in_room(self, user_id, room_id):
+ """Gets the invite for the given user and room
+
+ Args:
+ user_id (str)
+ room_id (str)
+
+ Returns:
+ Deferred: Resolves to either a RoomsForUser or None if no invite was
+ found.
+ """
invites = yield self.get_invited_rooms_for_user(user_id)
for invite in invites:
if invite.room_id == room_id:
diff --git a/synapse/storage/schema/delta/31/invites.sql b/synapse/storage/schema/delta/31/invites.sql
index 1c83430da4..2c57846d5a 100644
--- a/synapse/storage/schema/delta/31/invites.sql
+++ b/synapse/storage/schema/delta/31/invites.sql
@@ -26,17 +26,17 @@ CREATE TABLE local_invites(
-- Insert all invites for local users into new `invites` table
INSERT INTO local_invites SELECT
- stream_ordering as stream_id,
- sender as inviter,
- state_key as invitee,
- event_id,
- room_id,
- NULL as locally_rejected,
- NULL as replaced_by
-FROM events
-NATURAL JOIN current_state_events
-NATURAL JOIN room_memberships
-WHERE membership = 'invite' AND state_key IN (SELECT name FROM users);
+ stream_ordering as stream_id,
+ sender as inviter,
+ state_key as invitee,
+ event_id,
+ room_id,
+ NULL as locally_rejected,
+ NULL as replaced_by
+ FROM events
+ NATURAL JOIN current_state_events
+ NATURAL JOIN room_memberships
+ WHERE membership = 'invite' AND state_key IN (SELECT name FROM users);
CREATE INDEX local_invites_id ON local_invites(stream_id);
CREATE INDEX local_invites_for_user_idx ON local_invites(invitee, locally_rejected, replaced_by, room_id);
|