support returning current state from QueryStateAndAuthChain

This commit is contained in:
Matthew Hodgson 2020-09-12 01:23:57 +01:00
parent fff18454b1
commit c6a2604edc
2 changed files with 35 additions and 4 deletions

View file

@ -177,7 +177,7 @@ type QueryStateAndAuthChainRequest struct {
// The room ID to query the state in.
RoomID string `json:"room_id"`
// The list of prev events for the event. Used to calculate the state at
// the event
// the event. If empty, assumes current state.
PrevEventIDs []string `json:"prev_event_ids"`
// The list of auth events for the event. Used to calculate the auth chain
AuthEventIDs []string `json:"auth_event_ids"`

View file

@ -334,10 +334,41 @@ func (r *Queryer) QueryStateAndAuthChain(
response.RoomExists = true
response.RoomVersion = info.RoomVersion
stateEvents, err := r.loadStateAtEventIDs(ctx, *info, request.PrevEventIDs)
if err != nil {
return err
var stateEvents []gomatrixserverlib.Event
if len(request.PrevEventIDs) > 0 {
stateEvents, err = r.loadStateAtEventIDs(ctx, *info, request.PrevEventIDs)
if err != nil {
return err
}
} else {
// no PrevEventIDs or AuthEventIDs were provided, so return current state instead.
// XXX: is this right?
roomState := state.NewStateResolution(r.DB, *info)
// no need to resolve state again later
request.ResolveState = false
var currentStateSnapshotNID types.StateSnapshotNID
_, currentStateSnapshotNID, _, err =
r.DB.LatestEventIDs(ctx, info.RoomNID)
if err != nil {
return err
}
var stateEntries []types.StateEntry
stateEntries, err = roomState.LoadStateAtSnapshot(
ctx, currentStateSnapshotNID,
)
if err != nil {
return err
}
stateEvents, err = helpers.LoadStateEvents(ctx, r.DB, stateEntries)
if err != nil {
return err
}
}
response.PrevEventsExist = true
// add the auth event IDs for the current state events too