Reduce number of API calls in generateInitialEvents, preserve membership fields

This commit is contained in:
Neil Alexander 2022-04-01 16:52:06 +01:00
parent 9c5ec21a30
commit e34da3a52d
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944

View file

@ -49,6 +49,7 @@ func (r *Upgrader) PerformRoomUpgrade(
res.NewRoomID, res.Error = r.performRoomUpgrade(ctx, req) res.NewRoomID, res.Error = r.performRoomUpgrade(ctx, req)
if res.Error != nil { if res.Error != nil {
res.NewRoomID = "" res.NewRoomID = ""
logrus.WithContext(ctx).WithError(res.Error).Error("Room upgrade failed")
} }
} }
@ -309,56 +310,65 @@ func (r *Upgrader) userIsAuthorized(ctx context.Context, userID, roomID string,
return pl.UserLevel(userID) >= plToUpgrade return pl.UserLevel(userID) >= plToUpgrade
} }
// nolint:composites,gocyclo
func (r *Upgrader) generateInitialEvents(ctx context.Context, userID, roomID, newVersion string, tombstoneEvent *gomatrixserverlib.HeaderedEvent) ([]fledglingEvent, *api.PerformError) { func (r *Upgrader) generateInitialEvents(ctx context.Context, userID, roomID, newVersion string, tombstoneEvent *gomatrixserverlib.HeaderedEvent) ([]fledglingEvent, *api.PerformError) {
oldCreateEvent := api.GetStateEvent(ctx, r.URSAPI, roomID, gomatrixserverlib.StateKeyTuple{ req := &api.QueryLatestEventsAndStateRequest{
EventType: gomatrixserverlib.MRoomCreate, RoomID: roomID,
StateKey: "", }
}) res := &api.QueryLatestEventsAndStateResponse{}
oldPowerLevelsEvent := api.GetStateEvent(ctx, r.URSAPI, roomID, gomatrixserverlib.StateKeyTuple{ if err := r.URSAPI.QueryLatestEventsAndState(ctx, req, res); err != nil {
EventType: gomatrixserverlib.MRoomPowerLevels, return nil, &api.PerformError{
StateKey: "", Msg: fmt.Sprintf("Failed to get latest state: %s", err),
}) }
oldJoinRulesEvent := api.GetStateEvent(ctx, r.URSAPI, roomID, gomatrixserverlib.StateKeyTuple{ }
EventType: gomatrixserverlib.MRoomJoinRules, state := make(map[gomatrixserverlib.StateKeyTuple]*gomatrixserverlib.HeaderedEvent, len(res.StateEvents))
StateKey: "", for _, event := range res.StateEvents {
}) if event.StateKey() == nil {
oldHistoryVisibilityEvent := api.GetStateEvent(ctx, r.URSAPI, roomID, gomatrixserverlib.StateKeyTuple{ continue // shouldn't ever happen, but better to be safe than sorry
EventType: gomatrixserverlib.MRoomHistoryVisibility, }
StateKey: "", tuple := gomatrixserverlib.StateKeyTuple{EventType: event.Type(), StateKey: *event.StateKey()}
}) state[tuple] = event
oldNameEvent := api.GetStateEvent(ctx, r.URSAPI, roomID, gomatrixserverlib.StateKeyTuple{ }
EventType: gomatrixserverlib.MRoomName,
StateKey: "", oldCreateEvent := state[gomatrixserverlib.StateKeyTuple{
}) EventType: gomatrixserverlib.MRoomCreate, StateKey: "",
oldTopicEvent := api.GetStateEvent(ctx, r.URSAPI, roomID, gomatrixserverlib.StateKeyTuple{ }]
EventType: gomatrixserverlib.MRoomTopic, oldMembershipEvent := state[gomatrixserverlib.StateKeyTuple{
StateKey: "", EventType: gomatrixserverlib.MRoomMember, StateKey: userID,
}) }]
oldGuestAccessEvent := api.GetStateEvent(ctx, r.URSAPI, roomID, gomatrixserverlib.StateKeyTuple{ oldPowerLevelsEvent := state[gomatrixserverlib.StateKeyTuple{
EventType: gomatrixserverlib.MRoomGuestAccess, EventType: gomatrixserverlib.MRoomPowerLevels, StateKey: "",
StateKey: "", }]
}) oldJoinRulesEvent := state[gomatrixserverlib.StateKeyTuple{
oldAvatarEvent := api.GetStateEvent(ctx, r.URSAPI, roomID, gomatrixserverlib.StateKeyTuple{ EventType: gomatrixserverlib.MRoomJoinRules, StateKey: "",
EventType: gomatrixserverlib.MRoomAvatar, }]
StateKey: "", oldHistoryVisibilityEvent := state[gomatrixserverlib.StateKeyTuple{
}) EventType: gomatrixserverlib.MRoomHistoryVisibility, StateKey: "",
oldEncryptionEvent := api.GetStateEvent(ctx, r.URSAPI, roomID, gomatrixserverlib.StateKeyTuple{ }]
EventType: gomatrixserverlib.MRoomEncryption, oldNameEvent := state[gomatrixserverlib.StateKeyTuple{
StateKey: "", EventType: gomatrixserverlib.MRoomName, StateKey: "",
}) }]
oldServerAclEvent := api.GetStateEvent(ctx, r.URSAPI, roomID, gomatrixserverlib.StateKeyTuple{ oldTopicEvent := state[gomatrixserverlib.StateKeyTuple{
EventType: "m.room.server_acl", EventType: gomatrixserverlib.MRoomTopic, StateKey: "",
StateKey: "", }]
}) oldGuestAccessEvent := state[gomatrixserverlib.StateKeyTuple{
// Not in the spec, but needed for sytest compatablility EventType: gomatrixserverlib.MRoomGuestAccess, StateKey: "",
oldRelatedGroupsEvent := api.GetStateEvent(ctx, r.URSAPI, roomID, gomatrixserverlib.StateKeyTuple{ }]
EventType: "m.room.related_groups", oldAvatarEvent := state[gomatrixserverlib.StateKeyTuple{
StateKey: "", EventType: gomatrixserverlib.MRoomAvatar, StateKey: "",
}) }]
oldCanonicalAliasEvent := api.GetStateEvent(ctx, r.URSAPI, roomID, gomatrixserverlib.StateKeyTuple{ oldEncryptionEvent := state[gomatrixserverlib.StateKeyTuple{
EventType: gomatrixserverlib.MRoomCanonicalAlias, EventType: gomatrixserverlib.MRoomEncryption, StateKey: "",
StateKey: "", }]
}) oldCanonicalAliasEvent := state[gomatrixserverlib.StateKeyTuple{
EventType: gomatrixserverlib.MRoomCanonicalAlias, StateKey: "",
}]
oldServerAclEvent := state[gomatrixserverlib.StateKeyTuple{
EventType: "m.room.server_acl", StateKey: "",
}]
oldRelatedGroupsEvent := state[gomatrixserverlib.StateKeyTuple{
EventType: "m.room.related_groups", StateKey: "",
}]
newCreateContent := map[string]interface{}{ newCreateContent := map[string]interface{}{
"creator": userID, "creator": userID,
@ -378,14 +388,20 @@ func (r *Upgrader) generateInitialEvents(ctx context.Context, userID, roomID, ne
Content: newCreateContent, Content: newCreateContent,
} }
membershipContent := gomatrixserverlib.MemberContent{
Membership: gomatrixserverlib.Join,
}
if err := json.Unmarshal(oldMembershipEvent.Content(), &membershipContent); err != nil {
util.GetLogger(ctx).WithError(err).Error()
return nil, &api.PerformError{
Msg: "Membership event content was invalid",
}
}
membershipContent.Membership = gomatrixserverlib.Join
membershipEvent := fledglingEvent{ membershipEvent := fledglingEvent{
Type: gomatrixserverlib.MRoomMember, Type: gomatrixserverlib.MRoomMember,
StateKey: userID, StateKey: userID,
Content: gomatrixserverlib.MemberContent{ Content: membershipContent,
Membership: gomatrixserverlib.Join,
DisplayName: "",
AvatarURL: "", // TODO
},
} }
powerLevelContent, err := oldPowerLevelsEvent.PowerLevels() powerLevelContent, err := oldPowerLevelsEvent.PowerLevels()