mirror of
https://github.com/matrix-org/dendrite.git
synced 2026-01-16 18:43:10 -06:00
PR comments; Add more comments
This commit is contained in:
parent
3a08948e15
commit
8ca2f0a793
|
|
@ -433,7 +433,7 @@ func (r *QueryCurrentStateResponse) UnmarshalJSON(data []byte) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// QueryMembershipAtEventRequest requests the membership events for a user
|
// QueryMembershipAtEventRequest requests the membership event for a user
|
||||||
// for a list of eventIDs.
|
// for a list of eventIDs.
|
||||||
type QueryMembershipAtEventRequest struct {
|
type QueryMembershipAtEventRequest struct {
|
||||||
RoomID string
|
RoomID string
|
||||||
|
|
@ -443,9 +443,10 @@ type QueryMembershipAtEventRequest struct {
|
||||||
|
|
||||||
// QueryMembershipAtEventResponse is the response to QueryMembershipAtEventRequest.
|
// QueryMembershipAtEventResponse is the response to QueryMembershipAtEventRequest.
|
||||||
type QueryMembershipAtEventResponse struct {
|
type QueryMembershipAtEventResponse struct {
|
||||||
// Memberships is a map from eventID to a list of events (if any). Events that
|
// Membership is a map from eventID to membership event. Events that
|
||||||
// do not have known state will return an empty array here.
|
// do not have known state will return a nil event, resulting in a "leave" membership
|
||||||
Memberships map[string]*gomatrixserverlib.HeaderedEvent `json:"memberships"`
|
// 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
|
// QueryLeftUsersRequest is a request to calculate users that we (the server) don't share a
|
||||||
|
|
|
||||||
|
|
@ -217,7 +217,7 @@ func (r *Queryer) QueryMembershipAtEvent(
|
||||||
request *api.QueryMembershipAtEventRequest,
|
request *api.QueryMembershipAtEventRequest,
|
||||||
response *api.QueryMembershipAtEventResponse,
|
response *api.QueryMembershipAtEventResponse,
|
||||||
) error {
|
) error {
|
||||||
response.Memberships = make(map[string]*gomatrixserverlib.HeaderedEvent)
|
response.Membership = make(map[string]*gomatrixserverlib.HeaderedEvent)
|
||||||
|
|
||||||
info, err := r.DB.RoomInfo(ctx, request.RoomID)
|
info, err := r.DB.RoomInfo(ctx, request.RoomID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -236,16 +236,16 @@ func (r *Queryer) QueryMembershipAtEvent(
|
||||||
return fmt.Errorf("requested stateKeyNID for %s was not found", request.UserID)
|
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 {
|
switch err {
|
||||||
case nil:
|
case nil:
|
||||||
return nil
|
return nil
|
||||||
case tables.OptimisationNotSupportedError: // fallthrough
|
case tables.OptimisationNotSupportedError: // fallthrough, slow way of getting the membership events for each event
|
||||||
default:
|
default:
|
||||||
return err
|
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])
|
stateEntries, err := helpers.MembershipAtEvent(ctx, r.DB, nil, request.EventIDs, stateKeyNIDs[request.UserID])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unable to get state before event: %w", err)
|
return fmt.Errorf("unable to get state before event: %w", err)
|
||||||
|
|
@ -270,7 +270,7 @@ func (r *Queryer) QueryMembershipAtEvent(
|
||||||
for _, eventID := range request.EventIDs {
|
for _, eventID := range request.EventIDs {
|
||||||
stateEntry, ok := stateEntries[eventID]
|
stateEntry, ok := stateEntries[eventID]
|
||||||
if !ok || len(stateEntry) == 0 {
|
if !ok || len(stateEntry) == 0 {
|
||||||
response.Memberships[eventID] = nil
|
response.Membership[eventID] = nil
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -287,10 +287,13 @@ func (r *Queryer) QueryMembershipAtEvent(
|
||||||
return fmt.Errorf("unable to get memberships at state: %w", err)
|
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 {
|
for i := range memberships {
|
||||||
ev := memberships[i]
|
ev := memberships[i]
|
||||||
if ev.Type() == gomatrixserverlib.MRoomMember && ev.StateKeyEquals(request.UserID) {
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -176,6 +176,9 @@ type Database interface {
|
||||||
PurgeRoom(ctx context.Context, roomID string) error
|
PurgeRoom(ctx context.Context, roomID string) error
|
||||||
UpgradeRoom(ctx context.Context, oldRoomID, newRoomID, eventSender 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(
|
GetMembershipForHistoryVisibility(
|
||||||
ctx context.Context, userNID types.EventStateKeyNID, info *types.RoomInfo, eventIDs ...string,
|
ctx context.Context, userNID types.EventStateKeyNID, info *types.RoomInfo, eventIDs ...string,
|
||||||
) (map[string]*gomatrixserverlib.HeaderedEvent, error)
|
) (map[string]*gomatrixserverlib.HeaderedEvent, error)
|
||||||
|
|
|
||||||
|
|
@ -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 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 = "" +
|
const insertEventSQL = "" +
|
||||||
|
|
|
||||||
|
|
@ -199,7 +199,7 @@ func visibilityForEvents(
|
||||||
membershipAtEvent: gomatrixserverlib.Leave, // default to leave, to not expose events by accident
|
membershipAtEvent: gomatrixserverlib.Leave, // default to leave, to not expose events by accident
|
||||||
visibility: event.Visibility,
|
visibility: event.Visibility,
|
||||||
}
|
}
|
||||||
ev, ok := membershipResp.Memberships[eventID]
|
ev, ok := membershipResp.Membership[eventID]
|
||||||
if !ok || ev == nil {
|
if !ok || ev == nil {
|
||||||
result[eventID] = vis
|
result[eventID] = vis
|
||||||
continue
|
continue
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue