aboutsummaryrefslogtreecommitdiff
path: root/roomserver/internal/helpers
diff options
context:
space:
mode:
authorKegsay <kegan@matrix.org>2020-09-02 17:13:15 +0100
committerGitHub <noreply@github.com>2020-09-02 17:13:15 +0100
commit9d9e854fe042cd2c83cf694d6b3e4c8e7046cde1 (patch)
tree75f9247df1d00b140c4249ef14b711b2839806bd /roomserver/internal/helpers
parentf06637435b2124c89dfdd96cd723f54cc7055602 (diff)
Add Queryer and Inputer and factor out more RSAPI stuff (#1382)
* Add Queryer and use embedded structs * Add Inputer and factor out more RS API stuff This neatly splits up the RS API based on the functionality it provides, whilst providing a useful place for code sharing via the `helpers` package.
Diffstat (limited to 'roomserver/internal/helpers')
-rw-r--r--roomserver/internal/helpers/helpers.go53
1 files changed, 53 insertions, 0 deletions
diff --git a/roomserver/internal/helpers/helpers.go b/roomserver/internal/helpers/helpers.go
index d7bb40af..b7e6ce86 100644
--- a/roomserver/internal/helpers/helpers.go
+++ b/roomserver/internal/helpers/helpers.go
@@ -324,3 +324,56 @@ BFSLoop:
return resultNIDs, err
}
+
+func QueryLatestEventsAndState(
+ ctx context.Context, db storage.Database,
+ request *api.QueryLatestEventsAndStateRequest,
+ response *api.QueryLatestEventsAndStateResponse,
+) error {
+ roomInfo, err := db.RoomInfo(ctx, request.RoomID)
+ if err != nil {
+ return err
+ }
+ if roomInfo == nil || roomInfo.IsStub {
+ response.RoomExists = false
+ return nil
+ }
+
+ roomState := state.NewStateResolution(db, *roomInfo)
+ response.RoomExists = true
+ response.RoomVersion = roomInfo.RoomVersion
+
+ var currentStateSnapshotNID types.StateSnapshotNID
+ response.LatestEvents, currentStateSnapshotNID, response.Depth, err =
+ db.LatestEventIDs(ctx, roomInfo.RoomNID)
+ if err != nil {
+ return err
+ }
+
+ var stateEntries []types.StateEntry
+ if len(request.StateToFetch) == 0 {
+ // Look up all room state.
+ stateEntries, err = roomState.LoadStateAtSnapshot(
+ ctx, currentStateSnapshotNID,
+ )
+ } else {
+ // Look up the current state for the requested tuples.
+ stateEntries, err = roomState.LoadStateAtSnapshotForStringTuples(
+ ctx, currentStateSnapshotNID, request.StateToFetch,
+ )
+ }
+ if err != nil {
+ return err
+ }
+
+ stateEvents, err := LoadStateEvents(ctx, db, stateEntries)
+ if err != nil {
+ return err
+ }
+
+ for _, event := range stateEvents {
+ response.StateEvents = append(response.StateEvents, event.Headered(roomInfo.RoomVersion))
+ }
+
+ return nil
+}