Skip to content
Snippets Groups Projects
Commit bed78897 authored by Daniel Wagner-Hall's avatar Daniel Wagner-Hall
Browse files

Apply forgetting properly to historical events

parent ba26eb3d
No related branches found
No related tags found
No related merge requests found
...@@ -92,7 +92,15 @@ class BaseHandler(object): ...@@ -92,7 +92,15 @@ class BaseHandler(object):
membership_event = state.get((EventTypes.Member, user_id), None) membership_event = state.get((EventTypes.Member, user_id), None)
if membership_event: if membership_event:
membership = membership_event.membership was_forgotten_at_event = yield self.store.was_forgotten_at(
membership_event.user_id,
membership_event.room_id,
membership_event.event_id
)
if was_forgotten_at_event:
membership = None
else:
membership = membership_event.membership
else: else:
membership = None membership = None
......
...@@ -271,6 +271,7 @@ class RoomMemberStore(SQLBaseStore): ...@@ -271,6 +271,7 @@ class RoomMemberStore(SQLBaseStore):
defer.returnValue(ret) defer.returnValue(ret)
def forget(self, user_id, room_id): def forget(self, user_id, room_id):
"""Indicate that user_id wishes to discard history for room_id."""
def f(txn): def f(txn):
sql = ( sql = (
"UPDATE" "UPDATE"
...@@ -287,6 +288,9 @@ class RoomMemberStore(SQLBaseStore): ...@@ -287,6 +288,9 @@ class RoomMemberStore(SQLBaseStore):
@defer.inlineCallbacks @defer.inlineCallbacks
def did_forget(self, user_id, room_id): def did_forget(self, user_id, room_id):
"""Returns whether user_id has elected to discard history for room_id.
Returns False if they have since re-joined."""
def f(txn): def f(txn):
sql = ( sql = (
"SELECT" "SELECT"
...@@ -298,10 +302,36 @@ class RoomMemberStore(SQLBaseStore): ...@@ -298,10 +302,36 @@ class RoomMemberStore(SQLBaseStore):
" AND" " AND"
" room_id = ?" " room_id = ?"
" AND" " AND"
" forgotten = 1" " forgotten = 0"
) )
txn.execute(sql, (user_id, room_id)) txn.execute(sql, (user_id, room_id))
rows = txn.fetchall() rows = txn.fetchall()
return rows[0][0] return rows[0][0]
count = yield self.runInteraction("did_forget_membership", f) count = yield self.runInteraction("did_forget_membership", f)
defer.returnValue(count > 0) defer.returnValue(count == 0)
@defer.inlineCallbacks
def was_forgotten_at(self, user_id, room_id, event_id):
"""Returns whether user_id has elected to discard history for room_id at event_id.
event_id must be a membership event."""
def f(txn):
sql = (
"SELECT"
" COUNT(*)"
"FROM"
" room_memberships"
" WHERE"
" user_id = ?"
" AND"
" room_id = ?"
" AND"
" event_id = ?"
" AND"
" forgotten = 1"
)
txn.execute(sql, (user_id, room_id, event_id))
rows = txn.fetchall()
return rows[0][0]
count = yield self.runInteraction("did_forget_membership_at", f)
defer.returnValue(count == 1)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment