mirror of
https://github.com/matrix-org/dendrite.git
synced 2026-01-01 03:03:10 -06:00
Reduce number of API calls in generateInitialEvents, preserve membership fields
This commit is contained in:
parent
9c5ec21a30
commit
e34da3a52d
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue