From 184f005e25470dd834d663175803b022eb4ba213 Mon Sep 17 00:00:00 2001 From: Brendan Abolivier Date: Wed, 2 Aug 2017 13:55:32 +0100 Subject: [PATCH] Use FillBuilder when possible --- .../dendrite/clientapi/events/events.go | 10 +++++-- .../dendrite/clientapi/readers/profile.go | 28 +------------------ .../dendrite/clientapi/writers/membership.go | 2 +- .../dendrite/clientapi/writers/sendevent.go | 27 +++--------------- 4 files changed, 13 insertions(+), 54 deletions(-) diff --git a/src/github.com/matrix-org/dendrite/clientapi/events/events.go b/src/github.com/matrix-org/dendrite/clientapi/events/events.go index 0e47eaaab..3bdfd9207 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/events/events.go +++ b/src/github.com/matrix-org/dendrite/clientapi/events/events.go @@ -26,12 +26,14 @@ import ( var ErrRoomNoExists = errors.New("Room does not exist") // FillBuilder fills the PrevEvents, AuthEvents and Depth fields of an event builder -// using the roomserver query API client provided +// using the roomserver query API client provided. Also fills roomserver query API +// response (if provided) in case the function calling FillBuilder needs to use it. // Returns ErrRoomNoExists if the state of the room could not be retrieved because // the room doesn't exist // Returns an error if something else went wrong func FillBuilder( builder *gomatrixserverlib.EventBuilder, queryAPI api.RoomserverQueryAPI, + queryRes *api.QueryLatestEventsAndStateResponse, ) error { eventsNeeded, err := gomatrixserverlib.StateNeededForEventBuilder(builder) if err != nil { @@ -43,8 +45,10 @@ func FillBuilder( RoomID: builder.RoomID, StateToFetch: eventsNeeded.Tuples(), } - var queryRes api.QueryLatestEventsAndStateResponse - if queryErr := queryAPI.QueryLatestEventsAndState(&queryReq, &queryRes); queryErr != nil { + if queryRes == nil { + queryRes = &api.QueryLatestEventsAndStateResponse{} + } + if queryErr := queryAPI.QueryLatestEventsAndState(&queryReq, queryRes); queryErr != nil { return err } diff --git a/src/github.com/matrix-org/dendrite/clientapi/readers/profile.go b/src/github.com/matrix-org/dendrite/clientapi/readers/profile.go index a449c38d8..971c6484b 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/readers/profile.go +++ b/src/github.com/matrix-org/dendrite/clientapi/readers/profile.go @@ -284,36 +284,10 @@ func buildMembershipEvents( return nil, err } - eventsNeeded, err := gomatrixserverlib.StateNeededForEventBuilder(&builder) - if err != nil { + if err := events.FillBuilder(&builder, queryAPI, nil); err != nil { return nil, err } - // Ask the roomserver for information about this room - queryReq := api.QueryLatestEventsAndStateRequest{ - RoomID: membership.RoomID, - StateToFetch: eventsNeeded.Tuples(), - } - var queryRes api.QueryLatestEventsAndStateResponse - if queryErr := queryAPI.QueryLatestEventsAndState(&queryReq, &queryRes); queryErr != nil { - return nil, err - } - - builder.Depth = queryRes.Depth - builder.PrevEvents = queryRes.LatestEvents - - authEvents := gomatrixserverlib.NewAuthEvents(nil) - - for i := range queryRes.StateEvents { - authEvents.AddEvent(&queryRes.StateEvents[i]) - } - - refs, err := eventsNeeded.AuthEventReferences(&authEvents) - if err != nil { - return nil, err - } - builder.AuthEvents = refs - eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), cfg.Matrix.ServerName) now := time.Now() event, err := builder.Build(eventID, now, cfg.Matrix.ServerName, cfg.Matrix.KeyID, cfg.Matrix.PrivateKey) diff --git a/src/github.com/matrix-org/dendrite/clientapi/writers/membership.go b/src/github.com/matrix-org/dendrite/clientapi/writers/membership.go index 6521b57b2..18e18f977 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/writers/membership.go +++ b/src/github.com/matrix-org/dendrite/clientapi/writers/membership.go @@ -77,7 +77,7 @@ func SendMembership( return httputil.LogThenError(req, err) } - if err = events.FillBuilder(&builder, queryAPI); err == events.ErrRoomNoExists { + if err = events.FillBuilder(&builder, queryAPI, nil); err == events.ErrRoomNoExists { return util.JSONResponse{ Code: 404, JSON: jsonerror.NotFound(err.Error()), diff --git a/src/github.com/matrix-org/dendrite/clientapi/writers/sendevent.go b/src/github.com/matrix-org/dendrite/clientapi/writers/sendevent.go index 3a4b50c7c..ea94fb4ae 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/writers/sendevent.go +++ b/src/github.com/matrix-org/dendrite/clientapi/writers/sendevent.go @@ -21,6 +21,7 @@ import ( "time" "github.com/matrix-org/dendrite/clientapi/auth/authtypes" + "github.com/matrix-org/dendrite/clientapi/events" "github.com/matrix-org/dendrite/clientapi/httputil" "github.com/matrix-org/dendrite/clientapi/jsonerror" "github.com/matrix-org/dendrite/clientapi/producers" @@ -64,36 +65,16 @@ func SendEvent( } builder.SetContent(r) - // work out what will be required in order to send this event - needed, err := gomatrixserverlib.StateNeededForEventBuilder(&builder) - if err != nil { - return httputil.LogThenError(req, err) - } - - // Ask the roomserver for information about this room - queryReq := api.QueryLatestEventsAndStateRequest{ - RoomID: roomID, - StateToFetch: needed.Tuples(), - } var queryRes api.QueryLatestEventsAndStateResponse - if queryErr := queryAPI.QueryLatestEventsAndState(&queryReq, &queryRes); queryErr != nil { - return httputil.LogThenError(req, queryErr) - } - if !queryRes.RoomExists { + if err := events.FillBuilder(&builder, queryAPI, &queryRes); err == events.ErrRoomNoExists { return util.JSONResponse{ Code: 404, JSON: jsonerror.NotFound("Room does not exist"), } + } else if err != nil { + return httputil.LogThenError(req, err) } - // set the fields we previously couldn't do and build the event - builder.PrevEvents = queryRes.LatestEvents // the current events will be the prev events of the new event - var refs []gomatrixserverlib.EventReference - for _, e := range queryRes.StateEvents { - refs = append(refs, e.EventReference()) - } - builder.AuthEvents = refs - builder.Depth = queryRes.Depth eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), cfg.Matrix.ServerName) e, err := builder.Build( eventID, time.Now(), cfg.Matrix.ServerName, cfg.Matrix.KeyID, cfg.Matrix.PrivateKey,