PR comments; Add more comments

This commit is contained in:
Till Faelligen 2023-02-07 13:26:13 +01:00
parent 3a08948e15
commit 8ca2f0a793
No known key found for this signature in database
GPG key ID: ACCDC9606D472758
5 changed files with 19 additions and 12 deletions

View file

@ -433,7 +433,7 @@ func (r *QueryCurrentStateResponse) UnmarshalJSON(data []byte) error {
return nil
}
// QueryMembershipAtEventRequest requests the membership events for a user
// QueryMembershipAtEventRequest requests the membership event for a user
// for a list of eventIDs.
type QueryMembershipAtEventRequest struct {
RoomID string
@ -443,9 +443,10 @@ type QueryMembershipAtEventRequest struct {
// QueryMembershipAtEventResponse is the response to QueryMembershipAtEventRequest.
type QueryMembershipAtEventResponse struct {
// Memberships is a map from eventID to a list of events (if any). Events that
// do not have known state will return an empty array here.
Memberships map[string]*gomatrixserverlib.HeaderedEvent `json:"memberships"`
// Membership is a map from eventID to membership event. Events that
// do not have known state will return a nil event, resulting in a "leave" membership
// when calculating history visibility.
Membership map[string]*gomatrixserverlib.HeaderedEvent `json:"membership"`
}
// QueryLeftUsersRequest is a request to calculate users that we (the server) don't share a

View file

@ -217,7 +217,7 @@ func (r *Queryer) QueryMembershipAtEvent(
request *api.QueryMembershipAtEventRequest,
response *api.QueryMembershipAtEventResponse,
) error {
response.Memberships = make(map[string]*gomatrixserverlib.HeaderedEvent)
response.Membership = make(map[string]*gomatrixserverlib.HeaderedEvent)
info, err := r.DB.RoomInfo(ctx, request.RoomID)
if err != nil {
@ -236,16 +236,16 @@ func (r *Queryer) QueryMembershipAtEvent(
return fmt.Errorf("requested stateKeyNID for %s was not found", request.UserID)
}
response.Memberships, err = r.DB.GetMembershipForHistoryVisibility(ctx, stateKeyNIDs[request.UserID], info, request.EventIDs...)
response.Membership, err = r.DB.GetMembershipForHistoryVisibility(ctx, stateKeyNIDs[request.UserID], info, request.EventIDs...)
switch err {
case nil:
return nil
case tables.OptimisationNotSupportedError: // fallthrough
case tables.OptimisationNotSupportedError: // fallthrough, slow way of getting the membership events for each event
default:
return err
}
response.Memberships = make(map[string]*gomatrixserverlib.HeaderedEvent)
response.Membership = make(map[string]*gomatrixserverlib.HeaderedEvent)
stateEntries, err := helpers.MembershipAtEvent(ctx, r.DB, nil, request.EventIDs, stateKeyNIDs[request.UserID])
if err != nil {
return fmt.Errorf("unable to get state before event: %w", err)
@ -270,7 +270,7 @@ func (r *Queryer) QueryMembershipAtEvent(
for _, eventID := range request.EventIDs {
stateEntry, ok := stateEntries[eventID]
if !ok || len(stateEntry) == 0 {
response.Memberships[eventID] = nil
response.Membership[eventID] = nil
continue
}
@ -287,10 +287,13 @@ func (r *Queryer) QueryMembershipAtEvent(
return fmt.Errorf("unable to get memberships at state: %w", err)
}
// Iterate over all membership events we got. Given we only query the membership for
// one user and assuming this user only ever has one membership event associated to
// a given event, overwrite any other existing membership events.
for i := range memberships {
ev := memberships[i]
if ev.Type() == gomatrixserverlib.MRoomMember && ev.StateKeyEquals(request.UserID) {
response.Memberships[eventID] = ev.Event.Headered(info.RoomVersion)
response.Membership[eventID] = ev.Event.Headered(info.RoomVersion)
}
}
}

View file

@ -176,6 +176,9 @@ type Database interface {
PurgeRoom(ctx context.Context, roomID string) error
UpgradeRoom(ctx context.Context, oldRoomID, newRoomID, eventSender string) error
// GetMembershipForHistoryVisibility queries the membership events for the given eventIDs.
// Returns a map from (input) eventID -> membership event. If no membership event is found, returns an empty event, resulting in
// a membership of "leave" when calculating history visibility.
GetMembershipForHistoryVisibility(
ctx context.Context, userNID types.EventStateKeyNID, info *types.RoomInfo, eventIDs ...string,
) (map[string]*gomatrixserverlib.HeaderedEvent, error)

View file

@ -71,7 +71,7 @@ CREATE TABLE IF NOT EXISTS roomserver_events (
);
-- Create an index which helps in resolving membership events (event_type_nid = 5) - (used for history visibility)
CREATE INDEX IF NOT EXISTS roomserver_events_history_visibility_idx ON roomserver_events (room_nid, event_state_key_nid) where (event_type_nid = 5);
CREATE INDEX IF NOT EXISTS roomserver_events_memberships_idx ON roomserver_events (room_nid, event_state_key_nid) WHERE (event_type_nid = 5);
`
const insertEventSQL = "" +

View file

@ -199,7 +199,7 @@ func visibilityForEvents(
membershipAtEvent: gomatrixserverlib.Leave, // default to leave, to not expose events by accident
visibility: event.Visibility,
}
ev, ok := membershipResp.Memberships[eventID]
ev, ok := membershipResp.Membership[eventID]
if !ok || ev == nil {
result[eventID] = vis
continue