mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-07-27 22:25:18 -04:00
Add an API for listing threads in a room. (#13394)
Implement the /threads endpoint from MSC3856. This is currently unstable and behind an experimental configuration flag. It includes a background update to backfill data, results from the /threads endpoint will be partial until that finishes.
This commit is contained in:
parent
b6baa46db0
commit
3bbe532abb
10 changed files with 522 additions and 6 deletions
|
@ -35,7 +35,7 @@ import attr
|
|||
from prometheus_client import Counter
|
||||
|
||||
import synapse.metrics
|
||||
from synapse.api.constants import EventContentFields, EventTypes
|
||||
from synapse.api.constants import EventContentFields, EventTypes, RelationTypes
|
||||
from synapse.api.errors import Codes, SynapseError
|
||||
from synapse.api.room_versions import RoomVersions
|
||||
from synapse.events import EventBase, relation_from_event
|
||||
|
@ -1616,7 +1616,7 @@ class PersistEventsStore:
|
|||
)
|
||||
|
||||
# Remove from relations table.
|
||||
self._handle_redact_relations(txn, event.redacts)
|
||||
self._handle_redact_relations(txn, event.room_id, event.redacts)
|
||||
|
||||
# Update the event_forward_extremities, event_backward_extremities and
|
||||
# event_edges tables.
|
||||
|
@ -1866,6 +1866,34 @@ class PersistEventsStore:
|
|||
},
|
||||
)
|
||||
|
||||
if relation.rel_type == RelationTypes.THREAD:
|
||||
# Upsert into the threads table, but only overwrite the value if the
|
||||
# new event is of a later topological order OR if the topological
|
||||
# ordering is equal, but the stream ordering is later.
|
||||
sql = """
|
||||
INSERT INTO threads (room_id, thread_id, latest_event_id, topological_ordering, stream_ordering)
|
||||
VALUES (?, ?, ?, ?, ?)
|
||||
ON CONFLICT (room_id, thread_id)
|
||||
DO UPDATE SET
|
||||
latest_event_id = excluded.latest_event_id,
|
||||
topological_ordering = excluded.topological_ordering,
|
||||
stream_ordering = excluded.stream_ordering
|
||||
WHERE
|
||||
threads.topological_ordering <= excluded.topological_ordering AND
|
||||
threads.stream_ordering < excluded.stream_ordering
|
||||
"""
|
||||
|
||||
txn.execute(
|
||||
sql,
|
||||
(
|
||||
event.room_id,
|
||||
relation.parent_id,
|
||||
event.event_id,
|
||||
event.depth,
|
||||
event.internal_metadata.stream_ordering,
|
||||
),
|
||||
)
|
||||
|
||||
def _handle_insertion_event(
|
||||
self, txn: LoggingTransaction, event: EventBase
|
||||
) -> None:
|
||||
|
@ -1989,13 +2017,14 @@ class PersistEventsStore:
|
|||
txn.execute(sql, (batch_id,))
|
||||
|
||||
def _handle_redact_relations(
|
||||
self, txn: LoggingTransaction, redacted_event_id: str
|
||||
self, txn: LoggingTransaction, room_id: str, redacted_event_id: str
|
||||
) -> None:
|
||||
"""Handles receiving a redaction and checking whether the redacted event
|
||||
has any relations which must be removed from the database.
|
||||
|
||||
Args:
|
||||
txn
|
||||
room_id: The room ID of the event that was redacted.
|
||||
redacted_event_id: The event that was redacted.
|
||||
"""
|
||||
|
||||
|
@ -2024,6 +2053,9 @@ class PersistEventsStore:
|
|||
self.store._invalidate_cache_and_stream(
|
||||
txn, self.store.get_thread_participated, (redacted_relates_to,)
|
||||
)
|
||||
self.store._invalidate_cache_and_stream(
|
||||
txn, self.store.get_threads, (room_id,)
|
||||
)
|
||||
|
||||
self.db_pool.simple_delete_txn(
|
||||
txn, table="event_relations", keyvalues={"event_id": redacted_event_id}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue